【发布时间】:2018-12-09 09:41:26
【问题描述】:
假设我编写了以下代码(带有 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 事务不是一回事
- 如果消息长时间未收到,代理将超时处理
【问题讨论】: