首页 > 解决方案 > JMS MessageListener 可以启动 XA 事务吗?

问题描述

假设我编写了以下代码(带有 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());
    }
});

但我担心

标签: jmsxaatomikos

解决方案


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


推荐阅读