我正在尝试一个涉及ActiveMQ队列和mySqL数据库的简单POC - 应用程序(Java POJO)从队列中读取消息并将其插入表中。我想在单个2阶段提交事务中执行此操作。我希望跨2个XA资源进行XA事务。 这是我能想到的,但不确定XAResource是如何工作的
/**assume the dest queue already has the messages I'm going to consumer here**/
xaDS = getDataSource();
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes1 = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
ActiveMQXAConnectionFactory cf1 = new ActiveMQXAConnectionFactory("vm://localhost?broker.persistent=false");
XAConnection connection1 = (XAConnection)cf1.createConnection();
connection1.start();
XASession session = connection1.createXASession();
XAResource xaRes2 = session.getXAResource();
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
xaRes1.start(xid, XAResource.TMNOFLAGS);
xaRes2.start(xid, XAResource.TMNOFLAGS);
MessageConsumer consumer = session.createConsumer(dest);
TextMessage receivedMessage = (TextMessage) consumer.receive(10);
stmt.executeUpdate("insert receivedMessage into Table");
xaRes1.end(xid, XAResource.TMSUCCESS);
xaRes2.end(xid, XAResource.TMSUCCESS);
ret1 = xaRes1.prepare(xid);
ret2= xaRes2.prepare(xid);
if ((ret1 == XAResource.XA_OK) && (ret2 == XAResource.XA_OK)) {
xaRes1.commit(xid, false);
xaRes2.commit(xid, false);
}
}
答案 0 :(得分:1)
我会从MSDN推荐这篇文章 https://msdn.microsoft.com/en-us/library/aa342335.aspx
有关如何继续使用XAResource的很好的总结。
然后肯定你应该参考XA规范 http://pubs.opengroup.org/onlinepubs/009680699/toc.pdf
一些转换经理的代码 - 例如Narayana也可能是一个很大的帮助:
https://github.com/jbosstm/narayana/blob/master/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java
您可以在此处查看方法topLevelPrepare
和topLevelCommit
,并检查所有失败可能性的处理。