第 9 章 检测取消连接
有时,客户端会意外停止,且不会有机会清理其资源。如果发生了这种情况,可以将资源保留为故障状态,并导致代理内存不足或其他系统资源。代理会在垃圾回收时检测到客户端的连接没有被正确关闭。连接随后关闭,并将以下类似的消息写入日志。日志捕获客户端会话实例化的确切代码行。这可让您识别错误并进行更正。
[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession] I'm closing a JMS Conection you left open. Please make sure you close all connections explicitly before let
ting them go out of scope!
[Finalizer] 20:14:43,244 WARNING [org.apache.activemq.artemis.core.client.impl.DelegatingSession] The session you didn't close was created here:
java.lang.Exception
at org.apache.activemq.artemis.core.client.impl.DelegatingSession.<init>(DelegatingSession.java:83)
at org.acme.yourproject.YourClass (YourClass.java:666) 1
- 1
- 连接实例化的客户端代码中的 行。
从客户端初始化中检测没有连接
只要从代理接收数据,客户端就会认为连接处于活动状态。通过为 client- failure-check-period 属性提供一个值
来配置客户端来检查其连接失败。网络连接的默认检查周期为 30000 毫秒,而 In-VM 连接的默认值是 -1
,如果未收到数据,客户端不会失败。
通常,您会将检查周期设置为低于代理连接生存时间的值,这样可确保客户端在临时失败时能够重新连接。
以下示例说明如何使用核心 JMS 客户端将检查周期设置为 10000 毫秒。
步骤
设置检测不可用连接的检查周期。
如果您将 JNDI 与核心 JMS 客户端搭配使用,请在 JNDI 上下文环境中设置检查周期,例如
jndi.properties
,如下所示。java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?clientFailureCheckPeriod=10000
如果您不使用 JNDI 设置检查周期,将值传递给
ActiveMQConnectionFactory.setClientFailureCheckPeriod()
。ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setClientFailureCheckPeriod(10000);
9.1. 连接 Time-To-Live
因为客户端和服务器间的网络连接可能会失败,然后返回在线,因此允许客户端重新连接,AMQ Broker 会等待清理不活跃的服务器端资源。此等待时间称为生存时间(TTL)。基于网络的连接的默认 TTL 是 60000
毫秒(1 分钟)。In-VM 连接的默认 TTL 是 -1
,这意味着代理永远不会超时。
在 Broker 中配置 Time-To-Live
如果您不希望客户端指定自己的连接 TTL,您可以在代理端设置全局值。这可以通过在代理配置中指定 connection-ttl-override
元素来实现。
检查 TTL 冲突连接的逻辑定期在代理上运行,具体由 connection-ttl-check-interval
元素决定。
步骤
通过添加
connection-ttl-override
配置元素并为生存时间提供值,编辑 BROKER_INSTANCE_DIR/etc/broker.xml,如下例所示。<configuration> <core> ... <connection-ttl-override>30000</connection-ttl-override> 1 <connection-ttl-check-interval>1000</connection-ttl-check-interval> 2 ... </core> </configuration>
在客户端上配置 Time-To-Live
默认情况下,客户端可以为自己的连接设置 TTL。以下示例演示了如何使用核心 JMS 客户端设置 Time-To-Live。
步骤
为客户端连接设置 Time-To-Live。
如果您使用 JNDI 来实例化连接工厂,您可以使用 参数
connectionTTL
在 xml 配置中指定。java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?connectionTTL=30000
如果您不使用 JNDI,则连接 TTL 由
ActiveMQConnectionFactory
实例上的ConnectionTTL
属性来定义。ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConnectionTTL(30000);