`
enshiwzw
  • 浏览: 49026 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MQ事-务

阅读更多

 

package com.sesoft.dev.mq.app;

 

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.util.Hashtable;

 

import oracle.jdbc.xa.client.OracleXADataSource;

 

import com.ibm.mq.MQC;

import com.ibm.mq.MQException;

import com.ibm.mq.MQMessage;

import com.ibm.mq.MQPutMessageOptions;

import com.ibm.mq.MQQueue;

import com.ibm.mq.MQQueueManager;

 

/**

 * Copyright (c) 2010,Selenium Soft All rights reserved.

 * @author eric.wang

 * @date 2010-9-25

 * @说明 MQ与ORACLE数据库的XA事务操作

 */

public class MQOrclXA {

public static final String qmName = "QM_eric";

public static final String queue = "default";

private static MQQueueManager qmgr = null;

private static Connection conn = null;

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

 

}

public static void initialize() throws Exception {

 

Hashtable properties = new Hashtable();

// 设置THREAD_AFFINITY_PROPERTY=TRUE,意思是多阶段事务不支持Shared方式的连接

properties.put(MQC.THREAD_AFFINITY_PROPERTY, new Boolean(true));

//下面可以取二个值MQC.TRANSPORT_MQSERIES_BINDINGS or MQC.TRANSPORT_MQSERIES_CLIENT

properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_BINDINGS);

qmgr = new MQQueueManager("QM_eric", properties);

//准备XA数据库

OracleXADataSource xads = new OracleXADataSource();

String dburl2 = "jdbc:oracle:thin:@192.168.21.226:1521:test";

xads.setURL(dburl2);

xads.setUser("edientjoin");

xads.setPassword("edientjoin");

// 得到连接

conn = qmgr.getJDBCConnection(xads);

// 关闭自动提交,必须

conn.setAutoCommit(false);

 

// all done

System.out.println("初始化完成");

}

public void doTransaction(){

try {

// theQueueManager.begin();

String sql = "update employees t set t.last_name='wang' where t.employee_id='1'";

PreparedStatement stmt = conn.prepareStatement(sql);

String msg = "A Msg";

stmt.execute();

stmt.close();

sendMsg(msg);

//不用提交数据库的事务,由消息中间件负责提交事务。

qmgr.commit();

// qmgr.backout();

System.out.println(" 事务操作成功");

}

catch (Exception e) {

// 发送失败的操作

System.out.println("事务操作失败,backout,错误信息是:");

e.printStackTrace();

try {

qmgr.backout();

}

catch (MQException me) {

System.out.println("backout失败:");

me.printStackTrace();

}

}

finally {

System.out.println("准备关闭资源: ");

try {

qmgr.disconnect();

conn.close();

}

catch (Exception e) {

System.out.println("关闭失败,错误信息如下:");

e.printStackTrace();

}

}

}

private static void sendMsg(String text) throws Exception { 

MQQueue queue = qmgr.accessQueue(qmName, MQC.MQOO_INPUT_AS_Q_DEF

| MQC.MQOO_OUTPUT, null, null, null);

MQMessage msg = new MQMessage();

msg.writeUTF(text);

MQPutMessageOptions pmo = new MQPutMessageOptions();

pmo.options += MQC.MQPMO_SYNCPOINT;

queue.put(msg, pmo);

}

}



这儿的事务处理代码实际上是有问题的。
还要相关的配置才行。

如果是ORACLE数据库本身相关的XA事务,ORACLE提供有相关的DEMO。请参阅。

  • xa.rar (3.4 KB)
  • 下载次数: 13
分享到:
评论
1 楼 yegaofei 2012-05-02  
当调用qmgr.backout();方法时,数据库端并没有发生回滚

相关推荐

Global site tag (gtag.js) - Google Analytics