3

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

我有两台服务器。第一个是带有 JBoss Messaging 1.4.3 的 JBoss 5.1,第二个是带有两个 MDB 的 JBoss 5.1。一个 MDB 正在将消息从队列 A 路由到 B。另一个正在做相反的事情 - 从 B 路由到 A。因此队列 A 和 B 上的消息总和应该是恒定的。只要我正确关闭服务器。

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

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

我用JmsXAas ConnectionFactory

有什么想法吗?

4

3 回答 3

5

据我了解您的问题,您正在尝试跨多个服务器 (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 文档中包含的所有文档:jbossts-full-4.6.1.GA.zip。具体来说,查看名为JBossTS 4.6.0 Server Integration Guide的 PDF ,其中将 Arjuna 事务管理器的不同特性定义为

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

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

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

并且还断言:

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

还请查看有关JBoss Messaging XA Configuration的此附带条件。确保遵循 JTA 文档中标题为JBoss Messaging XA Recovery Configuration的部分中概述的配置说明。

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


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

干杯。

//尼古拉斯

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

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

于 2012-07-02T13:36:01.213 回答
1

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

于 2012-08-16T10:13:36.117 回答
0

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

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

于 2012-06-20T05:36:24.557 回答