繁体   English   中英

JMS MessageListener可以启动XA事务吗?

[英]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());
    }
});

但我担心

  • 跨线程XA事务不是问题
  • 如果消息很长时间没有出现,则经纪人将使交易超时

我相信您需要实现某种包装器(类似于Java EE和Spring中的包装器),以便在调用onMessage 之前然后 onMessage完成之后与幕后的事务管理器协调每条收到的消息。 即使完全起作用,在onMessage的单次调用中交错不同事务的结束和开始似乎也不是一件容易的事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM