代码之家  ›  专栏  ›  技术社区  ›  Mauli

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

  •  18
  • Mauli  · 技术社区  · 14 年前

    在JMS中,很容易发现连接是否丢失,就会发生异常。但是我如何才能知道连接是否再次存在?

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

    我看不到任何能促进这类信息的听众。

    4 回复  |  直到 8 年前
        1
  •  16
  •   Michael Easter    13 年前

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

    有些传输提供商会自动为您重新连接应用程序,有些则会重新连接应用程序驱动器。通常,重新连接会将异常隐藏在应用程序中。缺点是你不想让应用程序永久挂起。 全部的 远程消息节点已关闭,因此最终, 必须 包括一些重新连接逻辑。

    现在有一个有趣的部分-您如何以一种与提供者无关的方式处理异常?JMS异常实际上毫无价值。例如,“安全异常”可以是Java安全策略过于严格,文件系统权限过于严格,LDAP证书失败,连接到传输失败,队列或主题的打开失败,或任何其他与安全相关的问题。链接的异常具有来自传输提供程序的详细信息,这确实有助于调试问题。我的客户一般都采取了三种不同的方法中的一种…

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

    在您的情况下,队列和主题对象可能只在原始连接的上下文中有效。假设自动重新连接的提供程序出现异常,则意味着重新连接失败,无法还原队列和主题对象的上下文。关闭所有对象并重新连接。

    您是否想做一些更为特定于提供者的事情,例如区分暂时性错误和永久性错误,这是其中一个“它取决于”的事情,并且您必须根据具体情况来确定这一点。

        2
  •  6
  •   shimatai    10 年前

    监视连接异常的最佳方法是设置异常侦听器,例如:

    ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("jmsContextName");
            connection = connectionFactory.createConnection();
            connection.setExceptionListener(new ExceptionListener() {
                @Override
                public void onException(JMSException exception) {
                    logger.error("ExceptionListener triggered: " + exception.getMessage(), exception);
                    try {
                        Thread.sleep(5000); // Wait 5 seconds (JMS server restarted?)
                        restartJSMConnection();
                    } catch (InterruptedException e) {
                        logger.error("Error pausing thread" + e.getMessage());
                    }
                }
            });
            connection.start();
    
        3
  •  4
  •   Georgy Bolyuba    14 年前

    JMS规范没有描述任何传输协议,它没有提到任何关于连接的内容(即,代理应该使它们保持活动状态,或者为每个会话建立一个新的连接)。所以,我想你的意思是

    现在我的连接中断(服务器关闭),这会导致异常。

    就是你试图发送一条消息,却得到了JMSException。

    我想,唯一能看经纪人是否能成功的方法就是发送一条消息。

        4
  •  1
  •   Chris K    14 年前

    对于基于连接的JMSException,唯一的选择是尝试在异常处理程序中重新建立连接,然后重试该操作。