首页 文章

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

提问于
浏览
3

我对分布式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

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

    08:46:59,678 INFO [TransactionManagerService] JBossTS Transaction Service(JTA版本 - 标签:JBOSSTS_4_6_1_GA_CP07)

    假设它与您运行的版本位于相同的附近,您应该查看此下载中提供的JBossTS文档中包含的所有文档:jbossts-full-4.6.1.GA.zip . 具体来说,请查看 Headers 为 JBossTS 4.6.0 Server Integration Guide 的PDF,其中包括将Arjuna事务管理器的不同个性定义为:

    JBossTS由一个事务引擎ArjunaCore组成,周围有多个“个性” . JBossTS JTA为Java Enterprise Edition应用程序提供了一个符合JTA 1.1的事务管理器 . 事务范围仅限于单个JVM . 这适用于在JVM之间的业务方法调用上不需要事务上下文传播的应用程序 . 例如,仅使用单个应用程序服务器实例的部署或仅使用多个此类实例进行负载 balancer 的部署,它们之间没有事务通信 . JBossTS JTS提供基于CORBA的分布式事务管理,可以通过JTS本机API或通过JTA接口来驱动 . 它适用于事务上下文必须跨越多个JVM的情况,例如部署在应用程序服务器集群上的Java EE应用程序,或者异构Java应用程序服务器之间的事务性业务方法调用,或者编写的Java和遗留应用程序需要互操作性的情况 . 另一种使用CORBA绑定的语言 .

    并断言:

    对于涉及多个JVM的事务用例,需要JBossTS JTS .

    另请参阅有关 JBoss Messaging XA Configuration 的此附带条款 . 请务必遵循 Headers 为JBoss Messaging XA Recovery Configuration的部分中JTA文档中概述的配置说明 .

    该文档提供了您需要做什么的合理摘要,但独立JBossTS实例的安装和配置的详细信息在 Headers 为 JBoss Transactions 4.6.0 Installation Guide 的文档中,而在文档中概述了用JTS服务替换AS 5.1 JTA事务服务在AS 5.1发行版本身 <jboss-home>\docs\examples\transactions\README.txt


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

    干杯 .

    //尼古拉斯

    附:一旦正确安装了JTS,控制台日志将在启动时显示如下内容:

    09:41:03,558 INFO [TransactionManagerService] JBossTS Transaction Service (JTS version - 标签:JBOSSTS_4_6_1_GA_CP07)

  • 5

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

  • 1

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

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

相关问题