Java Jms如何知道订阅服务器已不存在

Java Jms如何知道订阅服务器已不存在,java,jakarta-ee,jboss,jms,Java,Jakarta Ee,Jboss,Jms,我有一个分布式系统应用程序,它使用JBoss作为应用服务器。我有一个作为模拟引擎的客户端应用程序。当客户端启动时,它向服务器发送一条注册消息(JMS消息),然后在数据库中设置一些字段。当服务器启动时,它会向所有客户端发送一条消息(一个主题),以检查它们是否处于活动状态。若客户机处于活动状态,他们可以读取消息并向服务器(队列)发送一个响应,表明该消息处于活动状态 若用户正常关闭客户端,客户端将向服务器发送一条消息,我将注销该消息。然后服务器注销它。这是在数据库端完成的 若用户异常关闭客户端(kil

我有一个分布式系统应用程序,它使用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

如果您仍然希望坚持JMS的方式,那么您可以尝试同步发送消息,这意味着生产者将等待消费者的消息。这里有更多信息:

如果您仍然想坚持JMS的方式,那么您可以尝试同步发送消息,这意味着生产者将等待消费者的消息。这里的更多信息:

对我来说,消息传递系统的整个要点是解耦通信。发送者(在您的情况下是服务器)将其内容发送到主题,而实际上不知道谁会收到消息。客户机来来去去去,他们应该能够在消息(仍然)驻留在主题中时阅读消息

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

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

让我提出稍微不同的执行方式。 服务器最多不应该知道任何客户机(因为您的系统似乎是这样工作的),它应该知道客户机A、B和C现在处于活动状态,只是因为这些客户机将此知识传递给了服务器

为什么不让客户端每隔1分钟(或更短,取决于您的需要)向服务器队列发送“保持活动”消息,而不事先从服务器发送消息。 消息可以包括一些客户端标识符,如果不是由基础结构或其他内容添加的,则可能包括时间)

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

对我来说,消息传递系统的整个要点是通信解耦。发送者(在您的情况下是服务器)将其内容发送到主题,而实际上不知道谁会收到消息。客户机来来去去去,他们应该能够在消息(仍然)驻留在主题中时阅读消息

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

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

让我提出稍微不同的执行方式。 服务器最多不应该知道任何客户机(因为您的系统似乎是这样工作的),它应该知道客户机A、B和C现在处于活动状态,只是因为这些客户机将此知识传递给了服务器

为什么不让客户端每隔1分钟(或更短,取决于您的需要)向服务器队列发送“保持活动”消息,而不事先从服务器发送消息。 消息可以包括一些客户端标识符,如果不是由基础结构或其他内容添加的,则可能包括时间)

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

网络不可靠。无论您的客户端是否异常死亡,您的设计都需要考虑到这一点。网络不可靠。无论您的客户是否异常死亡,您的设计都需要考虑到这一点。“对我来说,消息传递系统的整个要点是解耦通信”-目标是正确的。可能是,我以错误的方式告诉了我的问题。但在我的系统中,通信也是解耦的。请看我的编辑。服务器向侦听主题的客户端发送消息。但你是在另一边建议。让我想一想,“对我来说,整个消息传递系统的重点是解耦的通信”-目标是正确的。可能是,我以错误的方式告诉了我的问题。但在我的系统中,通信也是解耦的。请看我的编辑。服务器向侦听主题的客户端发送消息。但你是在另一边建议。让我想想。