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()
.
的实现
我正在使用 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()
.