为什么要配置这个策略
最近在开发中遇到一个问题,mq的生产者正常工作,此时消费端由于异常与mq失去连接,加入消费端失联时间较长会导致mq堆积大量消息,等下一次消费端连接上的时候会有大量消息涌入,如果处理不好会导致消费端直接内存溢出。所以我们希望如果mq消息在我们设定的时间内没有被消费就把它删掉,一方面也能缓解mq端的消息积压,释放压力。
配置过期策略
打开配置文件在conf目录下的activemq.xml
- message过期自动删除配置
<broker xmlns="http://activemq.apache.org/schema/core" schedulePeriodForDestinationPurge="10000">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" expireMessagesPeriod="60000">
<deadLetterStrategy>
<sharedDeadLetterStrategy processExpired="false" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
</broker>
在broker
节点的destinationPolicy
节点加入即可
标签processExpired="false"
表示不保存过期消息到死信队列,处理手段为删除,为true则是保留。
标签expireMessagesPeriod="60000"
属性表示每隔60秒钟检查message
是否过期。
topic=">"
表示该策略对所有topic都生效。而topic="active.>"
就表示该策略对以active.开头的所有topic生效,注意有个点号。同理配置queue只需将topic改为queue即可。
- message过期时间设置
<borker>
<plugins>
<timeStampingBrokerPlugin ttlCeiling="360000" zeroExpirationOverride="360000" />
</plugins>
</borker>
上面那步搞定了之后,再修改timeStampingBrokerPlugin
标签里ttlCeiling="360000" zeroExpirationOverride="360000"
表示过期时间为360000ms(1小时)。
改完配置保存,重启生效。