涉及RMI调用的Spring分布式事务可能吗?

Pau*_*lan 6 java spring rmi distributed-transactions

背景

我有一个Spring Client应用程序,它使用RMI为两台服务器提供服务.在客户端中,我将实体保存到数据库(简单)并使用实体的详细信息对两个服务器进行rmi调用.我在服务器上使用Spring 3.0.2,客户端是一个简单的Spring-mvc站点.

要求

我的要求是,如果任何rmi调用对整个事务回滚的服务器失败,那么实体不会保存在客户端上,如果rmi调用成功,那么它也会回滚.

我对分布式事务比较新,但我想我想要一个使用RMI调用的XA事务.

我没有找到关于这个问题的一个很好的链接在这里,但它没有提及调用两个远程方法调用到不同的服务器时的模式.我希望在推荐阅读方面听到更多有关该主题的内容,以及有关如何使用spring实现此目的的任何指示.是否可以使用事务管理器?

谢谢.

ewe*_*nli 3

从理论上讲,这是如何处理这种情况的。首先你需要在每个节点上有几个JTA分布式事务管理器。一个充当主人,另一个充当奴隶。主站协调分布式事务到从站的提交/回滚。存在独立的 JTA 实现,例如JOTM

Vanilla RMI 不支持传播上下文信息,例如操作的事务 ID。但我认为 RMI 有钩子,因此可以对其进行扩展以支持这一点。你可以看看卡罗尔

您将需要使用XAResource将参与者包装在事务中,以便他们可以加入分布式事务中。主服务器需要向从服务器发送提交/回滚消息,从服务器需要使用XATerminator来执行相应操作。

JTA规范只是一个分布式事务管理器,事务日志中的操作记录需要由服务器完成。存在用于事务日志管理的库,例如HOWL

我认为即使使用分布式事务管理器,也不能使用 Spring 轻松地做到这一点。我曾经尝试将 RMI 与由独立客户端和多个从站控制的分布式事务一起使用。这是一篇关于它的博客文章。这相当复杂。

如果您使用带有 IIOP 的 Java EE 应用程序服务器,则可以免费获得所有这些。IIOP 支持分布式事务传播。客户端可以是应用程序客户端容器,您可以使用UserTransaction控制事务。这实际上是一种罕见的情况,我认为使用应用程序服务器确实是合理的。

但话虽如此,分布式事务是复杂的事情,它可能会导致启发式故障、一个节点死亡时超时以及复杂的恢复过程。

我的最后建议是:如果可能的话,尝试找到一种不涉及分布式事务的设计。这会让你的喜欢变得更容易。

您也许可以从 BPEL补偿机制中得到启发。也许还有其他的错误处理和鲁棒性设计方法可以避免使用分布式事务。