[英]Can JMS MessageListener start XA transactions?
假设我编写了以下代码(带有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());
}
});
但我担心
我相信您需要实现某种包装器(类似于Java EE和Spring中的包装器),以便在调用onMessage
之前然后在 onMessage
完成之后与幕后的事务管理器协调每条收到的消息。 即使完全起作用,在onMessage
的单次调用中交错不同事务的结束和开始似乎也不是一件容易的事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.