jms - 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());
}
});
但我担心
- 跨线程 XA 事务不是一回事
- 如果消息很长时间没有收到,broker 将超时交易
解决方案
我相信您需要实现某种包装器(类似于 Java EE 和 Spring 中所做的),以便在调用您之前和之后接收到的每条消息与幕后的事务管理器进行协调。将不同事务的结束和开始交错在一次调用中似乎不太可能产生良好的结果,即使它完全起作用。onMessage
onMessage
onMessage
推荐阅读
- django - MultipleObjectsReturned- get() 返回了多个 mPurchase - 它返回了 2
- java - 注释类型元素的语法是什么?
- python - 使用 Tkinter 选项框执行 MySQL 查询
- c# - 使用 C# 发送 Google Analytics 电子商务交易
- postgresql - 在 Postgresql 中计算相似字符串的数量
- python - 如何计算 python pandas 中最常见的 3 种类型?
- sql - 创建案例表达式时出现问题
- c++ - 检查字符串是否为有效数字(根本没有字母)
- c# - C#中的遍历路径
- python-3.x - Python 嵌套列表理解