多个java jvms

时间:2016-05-02 10:10:08

标签: java spring rest soap transactions

一个spring服务在一个Java部署单元(JVM)中实现。另一个Spring服务在另一个JVM中实现。从第1个jvm到第2个jvm进行服务电话。服务接口可以是rest,也可以是soap over http。需要在多个jvms上保持单个事务,这意味着如果任何服务失败,则必须回滚每个事务。这该怎么做。任何代码示例。

2 个答案:

答案 0 :(得分:1)

  1. 使用全局交易(即JTA),

  2. 使用XA资源(RDBMS和JMS连接),执行“使用2PC完全XA”。

  3. 有关Spring事务管理(包括JTA / XA场景)的进一步参考,请阅读:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#transaction

答案 1 :(得分:0)

REST面临与基于SOAP的Web服务完全相同的原子事务问题。没有状态连接,每个操作都会立即生效;执行一系列操作意味着其他客户可以看到临时状态。

当然,除非你通过设计来处理这个问题。首先,问问自己:我有一套标准的原子操作吗?通常情况就是如此。例如,对于银行业务,从一个账户中删除一笔金额并将相同金额添加到另一个账户通常是必需的原子操作。但是,REST API不应仅仅导出原始构建块,而应提供单个"转移"操作,它封装了整个过程。这提供了所需的原子性,同时也使客户端代码更加简单。此appracoh称为低粒度服务,或高级批量操作

如果没有简单的,预定义的所需原子操作序列集,问题就更严重了。常见的解决方案是批处理命令模式。定义一个REST方法来划分事务的开始,另一个REST方法来划分它的结束(一个'提交请求)。

发送提交请求之前,服务器对这些操作集之间发送的任何内容进行排队,但未提交。

这种模式使服务器显着复杂化 - 它必须维护每个客户端的状态。通常,第一个操作('开始事务')返回事务ID(TID),所有后续操作(包括提交)必须包含此TID作为参数。

对交易执行超时是个好主意:如果从最初的“开始交易”开始已经过了太多时间'请求,或自上一步以来,服务器有权中止事务。这可以防止潜在的DoS攻击,导致服务器通过保持过多的事务处理来浪费资源。客户端设计必须记住,必须检查每个操作的超时响应。

允许客户端通过提供“回滚”来中止交易也是一个好主意。 API。

设计使用多个并发事务的代码所需的常规注意事项在此复杂设计方案中照常应用。如果可能的话,尝试限制事务的使用,并支持高级批处理操作。

我不相信这些信息,我只是一名导演,信用归This article

另请阅读Transactions in REST?

您可以在此处获得一些方便的代码示例http://www.it-soa.eu/en/resp/atomicrest/userguide/index.html