代码之家  ›  专栏  ›  技术社区  ›  Paul Whelan

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

  •  6
  • Paul Whelan  · 技术社区  · 16 年前

    背景

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

    要求

    我的要求是,如果任何一个RMI调用失败到整个事务回滚的服务器,也就是说,实体没有保存在客户机上,如果任何一个RMI调用成功,这也会回滚。

    我对分布式事务比较陌生,但我想我需要一个使用RMI调用的类似XA的事务。

    我在这个问题上找到了一个很好的链接 here 但它没有提到当调用两个远程方法调用到不同的服务器时的模式。我希望听到更多关于这个主题的建议阅读,以及关于如何使用Spring实现这个目标的任何提示。是否可以为此使用事务管理器?

    谢谢您。

    2 回复  |  直到 13 年前
        1
  •  3
  •   Arjan Tijms Mike Van    13 年前

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

    Vanilla RMI不支持传播上下文信息,例如操作的事务ID。但是我认为RMI有钩子,所以它可以被扩展来支持这一点。你可以看看 Carol .

    你需要使用 XAResource 包装事务中的参与者,以便它们可以登记到分布式事务中。主服务器将需要向从服务器发送提交/回滚消息,这些消息将需要使用 XATerminator 采取相应行动。

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

    我不认为可以使用Spring——即使是与分布式事务管理器一起——来轻松地实现这一点。我曾经尝试过将RMI与从独立客户机和几个从机控制的分布式事务一起使用。这里是一个 blog post 关于它。这相当复杂。

    如果使用JavaEE应用服务器,IIOP,则可以免费获得所有这些。IIOP支持分布式事务传播。客户可以是 application client container ,您可以控制 UserTransaction . 这实际上是一种罕见的情况,我认为使用应用服务器是非常合理的。

    但也就是说,分布式事务是复杂的事情,它可能导致启发式失败、一个节点死亡时的超时以及复杂的恢复过程。

    我最后的建议是:如果可能的话,尽量找一个不涉及分布式事务的设计。这会让你的相貌更容易。

    你可以从BPEL那里获得灵感 compensation mechanism . 可能还有其他的错误处理和健壮性设计方法可以避免使用分布式事务。

        2
  •  1
  •   wax    16 年前

    据我所知,Spring本身并不管理分布式事务。它可以使用 JtaTransactionManager 它依次委托给JavaEE服务器的事务协调器。据我所知,这种事务仅在应用程序容器中注册的数据源之间可用。

    你可以自己写 XAResource 实现(不确定这是否是最好的方法,但仍然如此)并将其注册到应用程序容器中,但Spring对此没有太多帮助。

    推荐文章