我试图证明我不需要将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。
任何帮助都将不胜感激。
谢谢,威尔
答案 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