ActiveMQ配置自动清除不活跃目的地不生效如何解决
故障原因
配置未生效是三个典型问题导致的:
- 属性名拼写错误。配置中写的
inactiveTimoutBeforeGC是早期官方文档的笔误,漏了字母e,ActiveMQ 5.15.11 代码层实际识别的属性为inactiveTimeoutBeforeGC(正确拼写为timeout),拼写错误的属性会被配置解析器直接忽略,等于未设置不活跃超时阈值。 - 策略覆盖范围不全。当前
policyEntry仅配置了topic=">"匹配规则,仅对Topic类型目的地生效,未覆盖Queue类型目的地,如果需要自动清理不活跃Queue,必须单独新增对应匹配规则。 - 清理触发条件不满足。目的地被判定为可回收的不活跃状态,需要同时满足三个条件:无关联的在线生产者、无关联的在线消费者、无滞留未消费的消息,三个条件同时满足后持续时长超过设置的超时阈值才会被清理,只要存在未正常断开的客户端连接占用目的地,就不会触发回收。
修正配置
调整后的核心配置片段如下:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" deleteAllMessagesOnStartup="true" schedulePeriodForDestinationPurge="60000"> <destinationPolicy> <policyMap> <policyEntries> <!-- 匹配所有Topic类型目的地 --> <policyEntry topic=">" gcInactiveDestinations="true" inactiveTimeoutBeforeGC="300000"/> <!-- 匹配所有Queue类型目的地,按需开启 --> <policyEntry queue=">" gcInactiveDestinations="true" inactiveTimeoutBeforeGC="300000"/> <!-- 其余原有policyEntry配置保持不变 --> </policyEntries> </policyMap> </destinationPolicy> <!-- 其余Broker配置保持不变 --> </broker>
配置生效说明:
schedulePeriodForDestinationPurge="60000"表示每1分钟执行一次目的地扫描,inactiveTimeoutBeforeGC="300000"表示目的地连续5分钟满足不活跃条件才会被删除,配置加载后至少等待5分钟再验证清理效果,无需反复重启Broker。
内容的提问来源于stack exchange,提问作者arayq2
相关产品推荐
相关产品推荐

