使用spring和activemq进行XA事务

时间:2015-03-23 07:07:53

标签: jms activemq spring-boot xa

我试图证明我不需要将activemq rar部署到JBoss EAP 6.3以便使用XA事务......我只想使用活动的mq客户端jar。我创建了一个简单的spring-boot项目,并公开了一个通过restful web服务公开的方法。如果我部署了active-mq rar,则以下代码正确回滚。

@Transactional
public void work() throws Exception {

    ConnectionFactory connectionFactory = (ConnectionFactory) this.context
            .getBean("jmsConnectionFactory");

    // Send a message
    MessageCreator messageCreator = new MessageCreator() {
        @Override
        public Message createMessage(Session session) throws JMSException {
            return session.createTextMessage("Test message!");
        }
    };

    JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
    System.out.println("Sending a new message.");
    jmsTemplate.send("test-destination", messageCreator);

    throw new Exception("Something bad happened!!");
}

但是,当我通过JNDI创建自己的ConnectionFactory时,代码不会回滚,并且仍然会发送消息。

@Transactional
public void work() throws Exception {

    ConnectionFactory connectionFactory = null;
    try {
        Context ctx = new InitialContext();
        connectionFactory = (ConnectionFactory) ctx.lookup("java:/ConnectionFactory");
    } catch (NamingException e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }

    // Send a message
    MessageCreator messageCreator = new MessageCreator() {
        @Override
        public Message createMessage(Session session) throws JMSException {
            return session.createTextMessage("Test message!");
        }
    };

    JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
    System.out.println("Sending a new message.");
    jmsTemplate.send("test-destination", messageCreator);

    throw new Exception("Something bad happened!!");
}

我想了解的是,当activemq rar在EAP上部署为资源适配器时,spring-boot正在启动时提供XA支持。如果我明白这一点,我想我应该能够在我的spring应用程序(而不是基于spring-boot)中打包active-mq客户端jar和我的数据库jar,并且仍然提供XA支持,即通过委派来获得管理XA事务的弹簧到PlatformTransactionManager。

任何帮助都将不胜感激。

谢谢,威尔

1 个答案:

答案 0 :(得分:0)

Spring Boot是关于约定的。您需要指示要连接到XA连接工厂的Spring Boot。 根据Spring Boot文档(32.3 Using a Java EE managed transaction manager):

  

Spring Boot将尝试通过在JNDI路径 java:/ JmsXA java:/ XAConnectionFactory

中查找ConnectionFactory来自动配置JMS