0

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

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

我的第一个想法是从 client2 向 client1 和服务器发送一条带有结果的消息,但更多地考虑它会变得对错误敏感。

我已经看过 jms、jta、jca 等技术,但对一切都有些不知所措。我怀疑可能有更简单的方法。

4

2 回答 2

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、simple tcp..),您可能会遇到回复丢失的情况,C1 永远不会知道 C2 是否处理了该消息。通过使 C2 具有幂等性并让 C1 能够在一段时间后没有回复时重试事务,可以在某种程度上避免这种情况。

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

于 2013-01-19T20:50:49.147 回答
0

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

于 2013-01-19T10:46:47.830 回答