JBoss消息传递和XA事务:JMS消息丢失

时间:2012-06-19 19:48:43

标签: jboss transactions jms xa

我对分布式JMS进行了一些测试,目前我遇到了以下问题。

我有两台服务器。第一个是带有JBoss Messaging 1.4.3的JBoss 5.1,第二个是带有两个MDB的JBoss 5.1。一个MDB将消息从队列A路由到B.另一个是相反的 - 从B到A的路由。因此队列A和B上的消息总和应该是常量。只要我正确关闭服务器就可以了。

但如果我崩溃其中一个服务器的进程(使用kill -9),我可以观察到消息丢失(不是很多但是可见)。我不明白为什么。毕竟它似乎没有使用XA。

我尝试使用HSQLDB和Oracle作为JBM服务器上的持久性,但效果是一样的。

我将JmsXA用作ConnectionFactory

任何想法发生了什么?

3 个答案:

答案 0 :(得分:5)

据我了解您的问题,您正在尝试协调跨多个服务器(JVM)的XA事务,这需要您的服务器配置JTS,并且JBoss服务器通常仅默认配置为JTA。为了确保我们在这里谈论相同的版本,当我看到我的控制台登录启动JBoss AS 5.1时,它会报告以下JBossTS版本:

  

08:46:59,678 INFO [TransactionManagerService] JBossTS Transaction   服务( JTA 版本 - 代码: JBOSSTS_4_6_1_GA_CP07

假设与您正在运行的版本位于同一附近,您应该查看此下载中提供的JBossTS文档中包含的所有文档:jbossts-full-4.6.1.GA.zip。具体来说,请查看标题为 JBossTS 4.6.0服务器集成指南的PDF,其中包括将Arjuna事务管理器的不同个性定义为:

  

JBossTS由一个事务引擎ArjunaCore组成,有多个   围绕着它的“个性”。

     

JBossTS JTA 提供了JTA 1.1   兼容Java Enterprise Edition的事务管理器   应用。事务范围仅限于单个JVM。这是   适用于不需要交易的应用程序   JVM之间的业务方法调用上的上下文传播。对于   例如,部署中只有一个应用程序服务器   使用实例或使用多个此类实例进行加载   仅平衡,它们之间没有交易通信。

     

JBossTS JTS 提供基于CORBA的分布式事务管理   这可能是通过JTS本机API或通过JTA驱动的   接口。它适用于事务上下文的情况   必须跨越多个JVM,例如部署在Java上的Java EE应用程序   应用程序服务器集群,或需要互操作性的地方   异构Java之间的事务业务方法调用   应用程序服务器,或写入的Java和遗留应用程序   另一种使用CORBA绑定的语言。

并断言:

  

对于涉及多个JVM的事务用例,JBossTS JTS是   必需的。

另请参阅有关 JBoss Messaging XA配置的此附带条款。请务必遵循标题为JBoss Messaging XA Recovery Configuration

的部分中JTA文档中列出的配置说明

该文档提供了您需要做的一个很好的总结,但独立JBossTS实例的安装和配置的详细信息在标题为 JBoss Transactions 4.6.0安装指南的文档中,而在AS 5.1发行版中的文档中概述了用JTS服务替换AS 5.1 JTA事务服务< jboss-home> \ docs \ examples \ transactions \ README.txt


说了这么多,如果有任何方法可以使用一台服务器实现您的解决方案,我怀疑您会发现最好的方法。

干杯。

//尼古拉斯

P.S。正确安装JTS后,控制台日志将在启动时显示如下内容:

09:41:03,558 INFO [TransactionManagerService] JBossTS交易服务(** JTS 版本 - 标签:JBOSSTS_4_6_1_GA_CP07)**

答案 1 :(得分:1)

经过一些研究(及时拉伸)后,我发现XA恢复配置不正确,并且无法访问消息,因为全局事务永远不会完成。 尼古拉斯回答了这一点,所以非常感谢。 http://docs.jboss.org/jbossmessaging/docs/userguide-1.4.0.SP3/html_single/index.html#recovery

答案 2 :(得分:0)

单独启用XA的连接工厂不保证交易性。发送方和接收方都应声明它们正在使用事务,如本Java EE 6文档中所示Container-managed transactions docs

另外,请确保您的邮件是持久发送的。我建议对事务管理器进行一些跟踪/调试日志记录,以确保在应该的时候正确提交事务。