第 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>
    1
    所有连接的全局 TTL 被设置为 30000 毫秒。默认值为 -1,它允许客户端设置自己的 TTL。
    2
    检查死连接之间的间隔设置为 1000 毫秒。默认情况下,检查每 2000 毫秒完成一次。

在客户端上配置 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);
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.