【问题标题】:Can JMS MessageListener start XA transactions?JMS MessageListener 可以启动 XA 事务吗?
【发布时间】: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 事务不是一回事
  • 如果消息长时间未收到,代理将超时处理

【问题讨论】:

    标签: jms xa atomikos


    【解决方案1】:

    我相信您需要实现某种包装器(类似于 Java EE 和 Spring 中所做的),以便在您收到的每条消息之前与幕后的事务管理器进行协调onMessage 被调用,然后 onMessage 完成。在onMessage 的一次调用中交错不同事务的结束和开始似乎不太可能产生良好的结果,即使完全起作用。

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 2017-01-31
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2013-01-21
      • 2013-01-13
      相关资源
      最近更新 更多