在 ActiveMQ 中使用具有虚拟主题的持久订阅者,订阅恢复策略是否起作用?

Using durable subscribers with virtual topics in ActiveMQ and does Subscription Recovery Policy play any role?

我对如何正确使用 ActiveMQ 有点困惑。

我正在尝试做什么

我有系统 A,它向虚拟主题生成消息。然后是系统 B 和 C,它们都使用来自同一虚拟主题的消息。系统 B 或 C 可能会脱机。所以当他们重新上线时,我需要他们接收所有在离线期间产生的消息。

到目前为止我尝试了什么

我已阅读有关持久订阅者的信息 (http://activemq.apache.org/how-do-durable-queues-and-topics-work.html and Virtual topics/queues and durability)。这似乎符合我的问题描述,并且在做了一些实施之后,一切似乎都按我最初想要的方式工作。

是什么造成了混乱

然后我阅读了订阅恢复政策 (http://activemq.apache.org/subscription-recovery-policy.html)。这是我应该配置的东西还是我完全误解了什么?例如,如果我想存储指定数量的消息,我应该配置一个 FixedCountSubscriptionRecoveryPolicy 还是应该查看一些 pendingMessageLimitStrategy?

第一个问题是,当虚拟主题的主要目的是发布到主题(例如 VirtualTopic.FOO),然后在虚拟主题的主题部分使用持久主题订阅,然后在虚拟主题的主题部分创建队列消费者匹配过滤器值(例如 Consumer.A.VirtualTopic.FOO)?

关于恢复策略,它们仅适用于与 Durable Topic 订阅不同的主题订阅。对于普通的旧主题订阅,发送到主题的消息仅在连接时保留在该订阅的代理中,一旦它删除,该订阅正在播放的所有消息都将被删除。订阅恢复策略的作用是创建一个可配置的各种缓存,允许创建主题订阅并重播发送到匹配主题的消息。这对于持久主题订阅来说是不必要的,因为只要订阅者离线,发送到它订阅的主题的消息就会存储在代理消息存储中。

恢复策略只能在少数边缘情况下混合到持久主题订阅中,例如发送到标记为非持久主题的消息或在第一次订阅时可以从内存中恢复一些过去的消息并播放到新的持久主题中订阅作为一种入门,但这就是它们在耐用情况下的全部好处。

在任何情况下,您最好通过创建队列消费者来按照预期的方式使用虚拟主题,因为这种机制比持久主题订阅具有许多优势。 Virtual Destinations 上的 ActiveMQ 文档解释了所有这些。