【问题标题】:Jms How to know subscriber is not alive anymoreJms 如何知道订阅者不再活着
【发布时间】:2017-03-30 10:57:53
【问题描述】:

我有一个分布式系统应用程序,它使用 JBoss 作为应用程序服务器。我有一个用作模拟引擎的客户端应用程序。当客户端启动时,它会向服务器发送注册消息(JMS 消息),然后在数据库中设置一些字段。当服务器启动时,它会向所有客户端发送一条消息(主题)以检查它们是否处于活动状态。如果客户端还活着,他们可以读取消息并向服务器(队列)发送它还活着的响应。

如果用户正常关闭客户端,客户端会向服务器发送一条消息,我将取消注册。然后服务器注销它。这是在数据库端完成的。

如果用户异常关闭客户端(kill),则客户端无法向服务器发送消息进行注销。然后服务器不知道这个客户端不再活着。这会导致我的应用程序不一致。所以我需要一种方法来理解客户订阅的主题不再被订阅。

服务器向主题发送消息以检查客户端是否处于活动状态。

@Schedule(hour = "*", minute = "*", second = "30", persistent = false)
public void sendNodeStatusRequest() {
    Message msg = MessageFactory.createStatusRequestMessage();
    publishNodeMessage(msg);

}

一段时间后,服务器显示以下日志。我可以从 Java 中捕捉到这个警告吗?

07:17:00,698 WARN  [org.hornetq.core.protocol.core.impl.RemotingConnectionImpl] Connection failure 
 has been detected: Did not receive ping from /127.0.0.1:61888. It is likely 
 the client has exited or crashed without closing its connection, or the 
 network between the server and client has failed. The connection will now be  closed. [code=3]
 07:17:00,698 WARN  [org.hornetq.core.server.impl.ServerSessionImpl] Client 
connection failed, clearing up resources for session 4e4e9dc6-153e-11e7-
 80fa-742b62812c29

【问题讨论】:

  • 网络不可靠。无论您的客户是否异常死亡,您的设计都需要考虑到这一点。

标签: java jakarta-ee jboss jms


【解决方案1】:

对我来说,消息传递系统的全部意义在于解耦通信。发件人(在您的情况下为服务器)将其内容发送到主题,而实际上并不知道谁会收到消息。客户端来来去去,只要消息(仍然)驻留在主题中,他们就应该能够阅读消息。

现在根据您的问题,我了解到服务器通过将消息接收回专用队列来跟踪所有连接的客户端。

所以我在问自己——也许这里的设计有问题。

让我提出稍微不同的实施方式。 服务器不应该知道任何客户端,最多(因为你的系统似乎是这样工作的)它应该知道客户端 A、B 和 C 现在还活着只是因为这些客户端将这些知识传递给了服务器强>。

为什么不让客户端每隔 1 分钟(或更少,具体取决于您的需要)向服务器队列发送“保持活动”消息没有来自服务器的先前消息。 该消息可以包含一些客户端标识符,如果它不是由基础设施或其他东西添加的,则可能包含时间)

所以服务器只会收到这条消息,它会在内存中跟踪可用客户端的列表以及它们最后一次发送的时间。 因此,如果某个客户端“优雅地”断开连接 - 它可以向服务器发送一条特殊消息,例如“我是客户端 A 并认为我已断开连接”。否则(异常终止/网络中断/其他) - 它不会发送任何东西,服务器将有一个特殊的过程来检查列表中是否有过时的客户端,如果找到它们 - 它知道出了问题。

【讨论】:

  • “对我而言,消息传递系统的全部意义在于解耦通信”——目标正确。
  • 可能是,我以错误的方式告诉了我的问题。但在我的系统中,通信也是分离的。请看我的编辑。服务器向侦听主题的客户端发送消息。但你在另一边建议。让我想想。
【解决方案2】:

如果你仍然想坚持 JMS 的做法,那么你可以尝试同步发送消息,这意味着生产者会等到消费者收到消息。更多信息在这里:http://docs.oracle.com/javaee/6/tutorial/doc/bncfa.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 2017-03-02
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多