JMS MessageListener能否启动XA事务



假设我编写以下代码(使用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事务不是一回事
  • 如果消息很长一段时间没有出现,代理将超时交易

我认为您需要实现某种包装器(类似于Java EE和Spring中的包装器(,以便在调用onMessage之前和调用onMessage之后接收到的每个消息的后台与事务管理器进行协调。在onMessage的单个调用中交错不同事务的结束和开始似乎不太可能成功,甚至根本无法正常工作。

最新更新