如何确保RMI操作的原子性?

aye*_*gin 4 java rmi

我想使用RMI更新文件.如何确保操作状态.

客户端连接到服务器并调用方法.之后,客户端和服务器之间的连接中断,客户端获取RemoteException,但被调用的方法继续工作并更改文件然后返回并获得异常(假设它在写入响应时将实现连接丢失).

Con*_*lls 5

这在实践中非常复杂.您需要实现两阶段提交协议,其中客户端可以获得服务器可以保证提交的指示符,然后命令提交.

有一个名为XA的现成协议用于管理此过程,Java Transaction API支持此协议.基本上,您可以为您的文件构建一个兼容XA的资源管理器.

这不是一项微不足道的工作,但如果您不介意在基础架构中包含应用程序服务器或事务管理器,则不会超出可能性范围.这种方法的优点是可以连接到成熟的,经过调试的事务管理基础架构.

几个替代方案是:

  • 实现您自己的两阶段提交协议,或

  • 构造它是幂等的文件更新代码(多次调用以进行相同的更新只进行更新).在这种情况下,您可以重新尝试更新,直到客户端从服务器获得成功指示.

    请注意,除非您可以保证从客户端顺序写入,否则您还必须提供用于锁定和/或管理同一记录上的冲突更新的协议.根据您的应用程序,这可能是一个乐观的并发协议,但您仍然必须锁定您正在处理的范围,以使写入原子化.