版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qincidong/article/details/90109664
简介
生产者在某个topic发送了多条消息后,这个时候非持久订阅者才订阅,那么它是不能获取之前生产者发送的信息的。或者,由于网络问题,非持久类型的消费者处于非活跃状态,无法接收到生产者发送的消息。使用消息恢复策略,可以解决上面的问题。ActiveMQ目前支持一个定时或固定大小的恢复缓冲区,在你连接到broker后,在一段时间内的消息会重新发送给订阅者。
ActiveMQ提供的恢复策略
- FixedSizedSubscriptionRecoveryPolicy
保留固定字节的消息。
示例:
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<fixedSizedSubscriptionRecoveryPolicy maximumSize="1024"/>
</subscriptionRecoveryPolicy>
</policyEntry>
- FixedCountSubscriptionRecoveryPolicy
保留固定数量的消息
示例:
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<fixedCountSubscriptionRecoveryPolicy maximumSize="100"/>
</subscriptionRecoveryPolicy>
</policyEntry>
- LastImageSubscriptionRecoveryPolicy
保留最后一条记录
示例:
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>
- NoSubscriptionRecoveryPolicy
禁用回溯,这是默认配置。
示例:
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<noSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>
- QueryBasedSubscriptionRecoveryPolicy
根据查询机制使用回溯
示例:
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<queryBasedSubscriptionRecoveryPolicy query="Color='red' AND Name='tom'"/>
</subscriptionRecoveryPolicy>
</policyEntry>
- TimedSubscriptionRecoveryPolicy
保留指定时间内的消息
示例:
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="60000"/>
</subscriptionRecoveryPolicy>
</policyEntry>
- RetainedMessageSubscriptionRecoveryPolicy
保留ActiveMQ.Retain属性值为true的最后1条消息
示例:
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<retainedMessageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>
注意:需要设置retroactive属性为true。即:
Topic topic = session.createTopic("TEST.TOPIC?consumer.retroactive=true");
MessageConsumer consumer = session.createConsumer(topic);
参考:http://activemq.apache.org/subscription-recovery-policy.html
也可以参考:https://www.cnblogs.com/hapjin/p/5649696.html