gpt4 book ai didi

java - Bitronix 事务无法与 JMS 队列一起使用

转载 作者:行者123 更新时间:2023-12-01 19:24:06 30 4
gpt4 key购买 nike

我的目标是使用 Bitronix 交易,我应该使用两种资源:

  1. 数据库
  2. JMS

我有以下java代码:

package com.mycompany.app;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Enumeration;

import javax.annotation.Resource;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.QueueReceiver;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerFactory;
import org.apache.activemq.broker.BrokerService;
import org.apache.activemq.transaction.Transaction;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.springframework.context.ApplicationContext;
import org.springframework.transaction.jta.JtaTransactionManager;

import bitronix.tm.BitronixTransactionManager;
import bitronix.tm.TransactionManagerServices;

public class JMSExample {

static String serverUrl = "tcp://localhost:61616"; // values changed
static String userName = "admin";
static String password = "admin";

static TextMessage message;

public static void sendTopicMessage(String topicName, String messageStr) {

Connection connection = null;

try {
BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();
btm.begin();
System.out.println("Publishing to destination '" + topicName + "'\n");
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(serverUrl);
connection = connectionFactory.createConnection();
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
Queue queue = session.createQueue(topicName);
Message msg = session.createTextMessage(messageStr);
msg.setJMSCorrelationID("correlationID1");
MessageProducer producer = session.createProducer(queue);
producer.send(msg);
System.out.println("Published message: " + messageStr);
session.commit();
session.close();
connection.close();
btm.rollback();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
JMSExample.sendTopicMessage("test", "Hi");
}
}

当我运行上述程序时,我可以看到队列中的消息。但我希望 JMS 事务与 Bitronix 事务一起嵌套。换句话说,如果 Bitronix 回滚,队列中也不应该有任何消息。

最佳答案

如果您想在事务中以原子方式使用 2 个资源,那么您需要获取 javax.transaction.xa.XAResource每个资源管理器(即 JMS 代理和数据库)的实现。一旦您拥有了这些,您就可以将它们加入到您使用事务管理器启动的 JTA 事务中。然后,任何提交或回滚都将使用登记的 XA 资源以原子方式执行。

要从 JMS 获取 XAResource,请查看 javax.jms.XAConnectionFactory 。您可以使用createXAConnection()来获取 javax.jms.XAConnection 的实例然后使用 createXASession() 获取 javax.jms.XASession然后最后使用getXAResource()

要从 JDBC 获取 XAResource,请查看 javax.sql.XADataSource 。您可以使用 getXAConnection() 获取 javax.sql.XAConnection 的实例然后使用getXAResource()

然后您可以调用getTransaction()在事务管理器上并使用返回的 javax.transaction.Transaction调用enlistResource()使用您的 XAResources。然后,当您调用 commit()rollback() 时,事务管理器将处理您的所有 XAResource 实现,并确保一切都以原子方式执行。

关于java - Bitronix 事务无法与 JMS 队列一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59327889/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com