Core Java应用程序中的分布式事务管理

时间:2014-07-25 03:59:09

标签: java jms distributed-transactions

是否可以在不在任何容器内运行的核心java应用程序中使用分布式事务管理器?

我有一个应用程序从JMS队列中读取消息并将其写入数据库。如果写入数据库失败,则应完成事务回滚。我在考虑使用JOTM,但不知道如何配置它。还不确定是否可以进行这种配置,因为应用程序不能在任何服务器上运行。任何建议都会有所帮助。提前致谢。

1 个答案:

答案 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;
}