假设我编写了以下代码(带有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());
}
});
但我担心
答案 0 :(得分:0)
我相信您需要实现某种包装器(类似于Java EE和Spring中的包装器),以便与您幕后收到的每条消息的幕后事务管理器进行协调。调用onMessage
,然后完成 onMessage
。即使完全发挥作用,一次调用onMessage
也可能使不同事务的结束和开始交织在一起。