客户端之间的分布式事务 - >服务器 - >客户

时间:2013-01-19 10:27:20

标签: java transactions jms jta xa

对于一个新项目,我正在寻找能让我的生活更轻松的技术。我的新项目基本上是2个客户端和一个服务器: client1向服务器发送message1,服务器向client2发送message1,client2对message1执行某些操作。

这可以使用普通的Java套接字或rmi或类似的技术来完成。但这里有一个问题: 整个过程需要是一个交易。我的意思是,当client2无法处理message1 client1时,服务器需要知道这一点并回滚已完成的任何操作。

我的第一个想法是从客户端2向客户端1和服务器发送一条消息,但结果更多,但是这会对错误敏感。

我已经看过像jms,jta,jca这样的技术,但是有些东西让我感到不知所措。我怀疑可能有一种更简单的方法。

2 个答案:

答案 0 :(得分:1)

我不确定单独的JTA或JMS是否可以解决您的问题,因为即使是分布式事务仍然在事务资源(例如JMS代理和数据库)之间,而不是在应用程序之间。

我仍然会在您的情况下进行事务传输,例如JMS。这将为您提供“保证交付”,这可能会简化错误处理。

1    c1 -> jms -> server -> jms -> c2   2

4    c1 <- jms <- server <- jms <- c2   3

如果你这样做,你可以确定c1(和服务器)最终将从c2收到“结果”,无论好坏。

如果C2在处理期间崩溃并且无法发回结果jms消息,则事务将回滚,在c2本地回滚,并且c2必须再次尝试。

此解决方案的缺点是消息可能会“卡住”,例如,如果c2根本无法处理消息,则它永远不会丢失。如果您路由同步请求(soap,RMI,简单tcp ..),您可能会面临丢失回复的情况,C1将永远不知道C2是否处理了该消息。通过使C2具有幂等性并使C1能够在一段时间后没有回复的情况下重试事务,可以避免这一点。

在我看来,没有“黄金解决方案”,但任何选择都会做得很好。祝你好运

答案 1 :(得分:0)

对于服务器组件,您可以尝试在JBoss AS等完全成熟的Java EE服务器中使用Message Driven Beans。在这种情况下,您的客户端将使用JMS与服务器进行通信。