Apache Artemis 不会停止扫描过期

Apache Artemis doesn't stop scanning for expires

我正在使用 Apache Artemis ActiveMQ 2.6.3 作为嵌入在 Spring 5 应用程序中的 MQTT 代理:

@Bean(initMethod = "start", destroyMethod = "stop")
fun embeddedActiveMQ(securityManager: ActiveMQJAASSecurityManager) =
        EmbeddedActiveMQ().apply {
            setConfiguration(getEmbeddedActiveMQConfiguration())
            setConfigResourcePath("activemq-broker.xml")
            setSecurityManager(securityManager)
        }

private fun getEmbeddedActiveMQConfiguration() =
        ConfigurationImpl().apply {
            addAcceptorConfiguration("netty", DefaultConnectionProperties.DEFAULT_BROKER_URL)
            addAcceptorConfiguration("mqtt", "tcp://$host:$mqttPort?protocols=MQTT")

            name = brokerName
            bindingsDirectory = "$dataDir${File.separator}bindings"
            journalDirectory = "$dataDir${File.separator}journal"
            pagingDirectory = "$dataDir${File.separator}paging"
            largeMessagesDirectory = "$dataDir${File.separator}largemessages"
            isPersistenceEnabled = persistence
            connectionTTLOverride = 60000
        }

尽管我按照 documentation 中的建议在上述 Kotlin 代码中将连接 TTL 设置为 60 秒并且客户端在一个小时前断开连接并终止,但日志显示以下条目:

2020-06-22 10:57:03,890 [Thread-29 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl@ade4717)] DEBUG o.a.a.a.core.server.impl.QueueImpl - Scanning for expires on client1.some-topic

2020-06-22 10:58:03,889 [Thread-35 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl@ade4717)] DEBUG o.a.a.a.core.server.impl.QueueImpl - Scanning for expires on client1.some-topic

根据这些日志条目,恐怕服务器永远不会清除“死”连接资源。

我应该怎么做才能真正从服务器上删除“死”连接以避免泄漏资源?

经纪人通常会创建地址、队列等资源来与客户打交道。对于 MQTT 客户端,代理将创建队列,这些队列本质上代表客户端的订阅。

在这种特殊情况下,已为 MQTT 订阅创建名为 client1.some-topic 的队列,并且代理正在扫描该队列以查找过期消息。此时看起来代理正在按设计工作。

当客户端在没有取消订阅的情况下断开连接时,代理对订阅的处理取决于客户端是否使用了 clean 会话。

如果客户端使用干净的会话,那么代理将在客户端断开连接时删除订阅队列(即使发生故障)。

否则代理必须保留订阅队列并将消息路由到它。如果客户端从不重新连接取消订阅,那么订阅可能会填满大量消息并触发代理的分页模式,最终甚至完全限制消息生成。在这种情况下,客户端可以重新连接并取消订阅,也可以通过管理方式删除订阅队列。