【问题标题】:Distributed Transaction management in Core Java applicationCore Java 应用程序中的分布式事务管理
【发布时间】:2014-07-25 03:59:08
【问题描述】:

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

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

【问题讨论】:

  • 我用 core Java 编写服务器已经超过 14 年了,你可以用简单的 Java 编写一些代码。
  • 谢谢彼得。如果你能给我提供同样的样品,那真的很有帮助。
  • 我倾向于编写代码来做到这一点,但大约 5 年没有。但是 JMS 可以设置为事务性的,由您决定是否提交()或不提交消息。

标签: java jms distributed-transactions


【解决方案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;
}

【讨论】:

  • user392909,之前我在 Spring 中使用 JOTM 使用分布式事务管理。但是这里我们没有使用 Spring。这意味着我们没有任何容器。如果应用程序不在任何容器内运行,我想知道是否有任何方法来处理分布式事务(借助 JOTM 或任何其他工具)。
  • 对不起,误读了这个问题,并且没有完成您之前提出的问题。可能会从 Atomikos 而不是 JOTM 开始,因为它似乎被更广泛地使用并且最近更新。这是一个例子:atomikos.com/Documentation/…
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
相关资源
最近更新 更多