Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bitronix事务不使用JMS队列_Java_Spring_Spring Boot_Jms_Bitronix - Fatal编程技术网

Java Bitronix事务不使用JMS队列

Java Bitronix事务不使用JMS队列,java,spring,spring-boot,jms,bitronix,Java,Spring,Spring Boot,Jms,Bitronix,我的目标是使用Bitronix事务,我应该使用两种资源: 数据库 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.Conne

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

  • 数据库
  • 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回滚,那么队列中也不应该有任何消息。

    删除session.commit(),而btm.rollback()执行此任务。

    如果您希望在事务中使用两个资源进行原子化工作,那么您需要从每个资源管理器(即JMS代理和数据库)获取实现。一旦您拥有了这些,您就可以在JTA事务中登记它们,您已经从事务管理器开始了。然后,任何提交或回滚都将使用登记的XA资源以原子方式执行

    要从JMS获取
    XAResource
    ,请查看。您可以使用
    createXAConnection()
    获取的实例,然后使用
    createXASession()
    获取实例,最后使用
    getXAResource()

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


    然后,您可以调用事务管理器,并使用返回的调用来调用您的XAResources。然后,当您调用
    commit()
    rollback()
    时,事务管理器将处理所有
    XAResource
    实现,并确保以原子方式执行所有操作。

    我认为这不是您问题的解决方案。删除commit()只意味着无论Bitronix事务是否回滚,都不会发送消息。