JMS (Apache Qpid) 连接处理

JMS (Apache Qpid) Connection handling

我正在使用 JMS (Apache Qpid) 创建到消息代理的连接。我确实创建了一些连接并将它们缓存在地图中 (Map<String, Connection>)。然而,消息代理有其自然限制(就资源而言,例如每个用户的连接数)有时会受到影响。如果我通过 Qpid 配置连接以使用空闲超时,我地图中的连接将不断断开并再次连接。假设连接限制设置为 3,当空闲超时在第 4 个连接可能连接并“窃取”连接时,我创建了第 4 个连接。所以这 4 个连接将争夺消息代理的限制。我已经注册了一个异常侦听器,并且确实看到了发生的错误。我想在出现特定错误时关闭连接,但似乎我对此无法控制。

那么我该如何管理连接的生命周期呢? 有没有办法获取有关连接是否已连接的信息?

我认为您应该在 ExceptionListener 实施中添加一些元数据,以便将其与相关连接相关联。您可能会使用与 Map<String, Connection> 中相同的 String 值。您也可以直接在 ExceptionListener 实现中设置 Connection

除此之外,您可能会重新考虑首先从您的客户端创建多个连接。一般来说,每个客户端一个连接就足够了。如果您需要在逻辑上分离不同的任务(例如生产和消费),那么您可以创建多个 会话 。这将有利于简化您的客户端应用程序并在代理上使用更少的资源。

最后,JMS API 不提供任何直接机制来测试连接的有效性。一般来说,假设连接有效是安全的,除非您通过 ExceptionListener.

同步或异步接收到异常。

我也遇到了同样的问题。由于 JMS 规范没有获取连接状态的方法,因此您可以使用替代方法获取状态

我使用 getClientID() 检查异常侦听器中的连接状态。如果您查看 getClientID() 操作的实现,您会发现他们首先检查连接状态,然后提供连接 ID

protected boolean isConnectionActive() { 
        boolean connectionStatus = false; 
        try { 
            String clientID = getConnection().getClientID(); 
            connectionStatus = true; 
        } catch (Exception e) { 
            connectionStatus = false; 
        } 
        return connectionStatus; }
    

注意 - 此解决方案肯定适用于最新的库 0.55,但将来 Qpid 团队可以更改 getClientID().

的实现