java - 如何确定 JMS 连接是否存在?

标签 java jms

在 JMS 中很容易发现连接是否丢失,是否发生异常。但是如何确定连接是否再次存在?

场景:我使用 JMS 与我的服务器通信。现在我的连接中断(服务器已关闭),导致异常。到目前为止,一切都很好。如果服务器再次启动并重新建立连接,我怎么知道?

我没有看到任何有助于提供此类信息的监听器。

最佳答案

啊……旧的异常处理/重新连接难题。

有些传输提供商会自动为您重新连接您的应用程序,有些则让应用程序驱动重新连接。通常,重新连接会对应用程序隐藏异常。不利的一面是,如果所有远程消息传递节点都关闭,您不希望应用程序永远挂起,因此最终,您必须包含一些重新连接逻辑。

现在是有趣的部分 - 您如何以提供者中立的方式处理异常? JMS 异常实际上毫无值(value)。例如,“安全异常”可能是 Java 安全策略过于严格、文件系统权限过于严格、LDAP 凭证失败、与传输的连接失败、队列或主题的打开失败或许多其他与安全相关的问题中的任何一个。链接异常具有来自传输提供商的详细信息,真正有助于调试问题。我的客户通常在这里采取三种不同方法中的一种...

  1. 对所有错误一视同仁。关闭所有对象并重新初始化它们。这是 JMS 可移植的。
  2. 允许应用检查关联的异常以区分 fatal error 和暂时错误(即身份验证错误与队列已满)。不是提供者可移植的。
  3. 提供者特定的错误处理类。其他两者的混合体。

在您的情况下,队列和主题对象可能仅在原始连接的上下文中有效。假设提供者自动重新连接,您遇到异常意味着重新连接失败,并且无法恢复队列和主题对象的上下文。关闭所有对象并重新连接。

您是否想要做更多特定于提供商的事情(例如区分暂时性和永久性错误)是“取决于”的事情之一,您必须根据具体情况确定。

关于java - 如何确定 JMS 连接是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187943/

相关文章:

java - 如何使用 Java 将 JMS 消息排入 Oracle AQ

java - Http 客户端连接因大数据请求而失败

java - Json/Jackson 命名约定

java - Eclipse 无法调试

java - JMS错误: can not send into foreign destinations

java - ActiveMq 不自动创建队列

jms - 是否可以阻止 MDB 在 Liberty Profile 中接收消息?

java - 使用 Swing Timer 延迟任务

java - 实现一个 Map 来计算字符频率

java - 如何从 Activemq 推送消息