问题描述
在项目使用activemq 5.14
时,客户端发送消息而没有得到回复(在不考虑消费者是什么问题的情况下),导致持久化消息不断积压而得不到释放,最后造成队列堵塞而嗝屁。
一般来说遇到这样的情况,可以在配置文件中配置消息的过期时间和死信处理来防止消息的积压,配置如下:
1
2
3
4<plugins>
<!-- 86,400,000ms = 1 day -->
<timeStampingBrokerPlugin ttlCeiling="10000" zeroExpirationOverride="10000"/>
</plugins>
配置消息过期时间使用timeStampingBrokerPlugin
插件,ttlCeiling
:表示过期时间上限(模块程序写的过期时间不能超过此时间,超过则以此时间为准),zeroExpirationOverride
:表示过期时间(给未分配过期时间的消息分配过期时间),一般来说这两个值是一样的。执行之后,message过期则客户端不能接收,那些已经过期的message将会保存在data/kahadb
目录下。
但是最近发现了一个问题,就是data/kahadb
这个目录最近越来越大,越积越多。但是这个topic和quere又依旧是“持续订阅”的,它的消费者还在。遇到这样的情况,如何在activemq里配置呢?
解决办法
配置message过期自动丢弃策略
1
2
3
4
5
6
7
8
9
10
11
12
13<borker>
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" expireMessagesPeriod="60000">
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
</borker>
标签processExpired="false"
表示不保存过期消息到死信队列,处理手段为删除,为true
则是保留。
标签expireMessagesPeriod="60000"
属性表示每隔60秒钟检查message是否过期。topic=">"
表示该策略对所有topic都生效。而topic="active.>"
就表示该策略对以active.
开头的所有topic
生效,注意有个点号.
。
- message过期时间设置
上面那步搞定了之后,再修改timeStampingBrokerPlugin
标签里ttlCeiling="360000" zeroExpirationOverride="360000"
表示过期时间为360000ms(1小时)。1
2
3
4
5
6<borker>
<plugins>
<!-- 86,400,000ms = 1 day -->
<timeStampingBrokerPlugin ttlCeiling="360000" zeroExpirationOverride="360000" />
</plugins>
</borker>
解决“空队列”的方法
如果不是那种“持续订阅”的topic,那就简单了,配置如下:
1
2
3
4
5
6
7
8
9<broker xmlns="http://activemq.apache.org/schema/core" schedulePeriodForDestinationPurge="10000">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" gcInactiveDestinations="true" inactiveTimoutBeforeGC="30000"/>
</policyEntries>
</policyMap>
</destinationPolicy>
</broker>
schedulePeriodForDestinationPurge
执行清理任务的周期,gcInactiveDestinations="true"
表示启用清理功能,inactiveTimoutBeforeGC="30000"
这个是Topic或Queue超时时间,在规定的时间内,无有效订阅,没有入队记录,超时后就会被清理。