【发布时间】:2015-05-26 02:57:21
【问题描述】:
我试图证明我不需要部署到 JBoss EAP 6.3 的 activemq rar 来使用 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 支持。如果我明白这一点,我想我应该能够将 active-mq 客户端 jar 和我的数据库 jar 打包到我的 spring 应用程序中(不是基于 spring-boot),并且仍然提供 XA 支持,即让 spring 通过委派来管理 XA 事务到 PlatformTransactionManager。
任何帮助将不胜感激。
谢谢,威尔
【问题讨论】:
-
哪个 Spring Boot 版本以及您为什么不使用 Spring Boot...如果您手动配置所有内容而不是让 Spring Boot 进行自动配置,那么在我看来。
-
嗨,我正在使用 spring-boot 1.2.1 来尝试证明这一点。我很想使用弹簧靴。但是,我正在使用一个已有 5 年历史的系统(它使用 spring,iBatis 托管在 weblogic 上)他们正在将应用程序移动到 JBoss EAP 和 JBoss A-MQ。它们需要 XA 事务支持,我想看看是否可以将 A-MQ 客户端 jar 与适当的 XA 数据库驱动程序结合使用。
-
我想了解使用 spring 的 PlatformManager 在应用服务器存在时如何将其委托给应用服务器。当我使用 spring-boot 时,我可以看到 PlatformManager 和 jmsConnectionFactory bean 正在加载。但是,当我不使用activemq rar并使用客户端时,似乎使用的是ActiveMQConnectionFactory而不是ActiveMQXAConnectionFactory。
标签: jms activemq spring-boot xa