是否可以在不在任何容器内运行的核心java应用程序中使用分布式事务管理器?
我有一个应用程序从JMS队列中读取消息并将其写入数据库。如果写入数据库失败,则应完成事务回滚。我在考虑使用JOTM,但不知道如何配置它。还不确定是否可以进行这种配置,因为应用程序不能在任何服务器上运行。任何建议都会有所帮助。提前致谢。
答案 0 :(得分:1)
此Spring blog entry说明了如何在容器外部配置JTA。 JOTM是所描述的选项之一。
对于您的情况,使用ChainedTransactionManager来模拟JTA会更简单。使用最少的Spring配置可以获得几乎相同的效果。配置如下,然后在监听器上指定@Transactional(value="chainedTransactionManager")
。
@Bean
JmsTransactionManager jmsTransactionManager(ConnectionFactory connectionFactory) {
JmsTransactionManager manager = new JmsTransactionManager();
manager.setConnectionFactory(connectionFactory);
return manager;
}
@Bean
JpaTransactionManager jpaTransactionManager() {
JpaTransactionManager manager = new JpaTransactionManager();
return manager;
}
//Encapsulating TM used to commit/rollback JMS and JPA together, without overhead of JTA. Note that JMS should be listed first, as transactions commit in reverse order and JMS less likely to fail.
@Bean
ChainedTransactionManager chainedTransactionManager(JmsTransactionManager jmsTransactionManager, JpaTransactionManager jpaTransactionManager){
ChainedTransactionManager manager = new ChainedTransactionManager(jmsTransactionManager, jpaTransactionManager);
return manager;
}