假设我编写了以下代码(使用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 回答
我相信你在Java EE和Spring中完成了这些工作,以便在调用
onMessage
之前接收到的每个消息后面的事务管理器进行协调,然后在onMessage
完成之后 . 在onMessage
的单个调用中交换不同事务的结束和开始似乎不太可能,甚至根本不起作用 .