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);
}
}