簡介
生產者在某個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