跨两个独立资源管理器/ XAResource的XA事务

时间:2015-12-09 00:24:25

标签: activemq distributed-transactions xa

我正在尝试一个涉及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);
    }
}

1 个答案:

答案 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 您可以在此处查看方法topLevelPreparetopLevelCommit,并检查所有失败可能性的处理。