首页 文章

JMS MessageListener可以启动XA事务吗?

提问于
浏览
0

假设我编写了以下代码(使用Atomikos的纯独立Java,没有Spring,没有JavaEE,没有bean):

XASession session = conn.createXASession();
MessageConsumer consumer = session.createConsumer(session.createQueue("QNAME"));
consumer.setMessageListener(new MessageListener() {
    @Override
    public void onMessage(Message message) {
        //some logic involving other XA resources
    }
});

它's obvious I haven'告诉我 XASession 关于我的 TransactionManager ,反之亦然,所以收到的消息不属于任何交易 . 我可以以某种方式改变它吗?我想过这样做:

XASession session = conn.createXASession();
MessageConsumer consumer = session.createConsumer(session.createQueue("QNAME"));
Transaction tx;
tm.begin(); //tm is TransactionManager
tx = tm.getTransaction();
tx.enlistResource(session.getXAResource());
consumer.setMessageListener(new MessageListener() {
    @Override
    public void onMessage(Message message) {
        //some logic involving other XA resources
        tm.commit();
        tm.begin();
        tx = tm.getTransaction();
        tx.enlistResource(session.getXAResource());
    }
});

但我很担心

  • 跨线程XA事务不是一件事

  • 如果消息长时间没有出现,经纪人将超时

1 回答

  • 0

    我相信你在Java EE和Spring中完成了这些工作,以便在调用 onMessage 之前接收到的每个消息后面的事务管理器进行协调,然后在 onMessage 完成之后 . 在 onMessage 的单个调用中交换不同事务的结束和开始似乎不太可能,甚至根本不起作用 .

相关问题