JMS MessageListener可以启动XA事务吗?

时间:2018-12-09 09:41:27

标签: jms xa atomikos

假设我编写了以下代码(带有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
    }
});

很明显,我没有告诉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 :(得分:0)

我相信您需要实现某种包装器(类似于Java EE和Spring中的包装器),以便与您幕后收到的每条消息的幕后事务管理器进行协调。调用onMessage,然后完成 onMessage。即使完全发挥作用,一次调用onMessage也可能使不同事务的结束和开始交织在一起。