简介

生产者在某个topic发送了多条消息后,这个时候非持久订阅者才订阅,那么它是不能获取之前生产者发送的信息的。或者,由于网络问题,非持久类型的消费者处于非活跃状态,无法接收到生产者发送的消息。使用消息恢复策略,可以解决上面的问题。ActiveMQ目前支持一个定时或固定大小的恢复缓冲区,在你连接到broker后,在一段时间内的消息会重新发送给订阅者。

ActiveMQ提供的恢复策略

  • FixedSizedSubscriptionRecoveryPolicy
    保留固定字节的消息。

示例:

1
2
3
4
5
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<fixedSizedSubscriptionRecoveryPolicy maximumSize="1024"/>
</subscriptionRecoveryPolicy>
</policyEntry>

  • FixedCountSubscriptionRecoveryPolicy
    保留固定数量的消息

示例:

1
2
3
4
5
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<fixedCountSubscriptionRecoveryPolicy maximumSize="100"/>
</subscriptionRecoveryPolicy>
</policyEntry>

  • LastImageSubscriptionRecoveryPolicy
    保留最后一条记录

示例:

1
2
3
4
5
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>

  • NoSubscriptionRecoveryPolicy
    禁用回溯,这是默认配置。

示例:

1
2
3
4
5
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<noSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>

  • QueryBasedSubscriptionRecoveryPolicy
    根据查询机制使用回溯

示例:

1
2
3
4
5
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<queryBasedSubscriptionRecoveryPolicy query="Color='red' AND Name='tom'"/>
</subscriptionRecoveryPolicy>
</policyEntry>

  • TimedSubscriptionRecoveryPolicy
    保留指定时间内的消息

示例:

1
2
3
4
5
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<timedSubscriptionRecoveryPolicy recoverDuration="60000"/>
</subscriptionRecoveryPolicy>
</policyEntry>

  • RetainedMessageSubscriptionRecoveryPolicy
    保留ActiveMQ.Retain属性值为true的最后1条消息

示例:

1
2
3
4
5
<policyEntry topic=">">
<subscriptionRecoveryPolicy>
<retainedMessageSubscriptionRecoveryPolicy/>
</subscriptionRecoveryPolicy>
</policyEntry>

注意:需要设置retroactive属性为true。即:

1
2
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