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

有什么想法吗?

最佳答案

据我所知,您正在尝试在多个服务器(JVM)之间协调XA事务,这要求您的服务器配置有JTS,并且JBoss服务器通常仅在默认情况下配置为JTA。为了确保我们在这里使用的是相同版本,当我查看启动JBoss AS 5.1的控制台日志时,它将报告以下JBossTS版本:

08:46:59,678 INFO [TransactionManagerService] JBossTS事务
服务( JTA 版本-标记: JBOSSTS_4_6_1_GA_CP07 )

假设它与您所运行的版本处于同一大致范围,则应查看此下载文件jbossts-full-4.6.1.GA.zip中提供的JBossTS文档中包含的所有文档。具体来说,请查看名为 JBossTS 4.6.0 Server Integration Guide 的PDF,其中除其他外将Arjuna Transaction Manager的不同个性定义为:

JBossTS包含一个事务引擎ArjunaCore,具有多个
“个性”围绕着它。

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

JBossTS JTS 提供基于CORBA的分布式事务管理
可以通过JTS本机API或通过JTA驱动
接口。适用于交易环境
必须跨越多个JVM,例如部署在一个JVM上的Java EE应用程序
应用程序服务器群集,或需要互操作性的位置
异构Java之间的事务性业务方法调用
应用程序服务器,或用Java编写的旧版应用程序
具有CORBA绑定的另一种语言。

并且断言:

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

还请查看有关的此条款,有关JBoss Messaging XA配置的条款。确保遵循JTA文档标题为JBoss Messaging XA Recovery Configuration一节中概述的配置说明。

该文档提供了您需要做的工作的摘要,但是独立的JBossTS实例的安装和配置的详细信息位于名为 JBoss Transactions 4.6.0 Installation Guide 的文档中,同时还替换了AS 5.1 JTA事务服务。 AS 5.1发行版本身的文档中的 \ docs \ examples \ transactions \ README.txt 中概述了有关JTS服务的信息

综上所述,如果有任何方法可以使用一台服务器实施解决方案,我怀疑您会找到更可取的方法。

干杯。

//尼古拉斯

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

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

07-24 09:17