我正在配置一个Apache Artemis消息代理。代理将接受大文件,下游消费者将访问主题以处理最新文件。现在我想知道如何使最新文件可用于开发运行。由于消息每天只到达几次,因此测试运行需要访问最后几条发送的消息,并且不能等待下一条消息。
对于生产和暂存系统,我发现持久订阅工作正常。我已经改编了一个Apache Camel配置作为说明。下面是接收消息的两个使用者,每个使用者使用持久订阅:
<route id="inbox">
<from uri="file:inbox"/>
<to uri="activemq:topic:testing"/>
</route>
<route id="outbox-staging">
<from uri="activemq:topic:testing?clientId=staging&durableSubscriptionName=staging"/>
<to uri="file:outbox-staging"/>
</route>
<route id="outbox-production">
<from uri="activemq:topic:testing?clientId=production&durableSubscriptionName=production"/>
<to uri="file:outbox-production"/>
</route>
这很好。如果消费者处于离线状态,它将在重新联机时拾取消息。现在,如果另一个消费者加入测试;
<route id="outbox-testing" streamCache="true">
<from uri="activemq:topic:testing?clientId=my-local-consumer&durableSubscriptionName=my-local-consumer"/>
<to uri="file:outbox-local"/>
</route>
由于订阅以前不存在,因此使用者将不得不等待新消息。我正在寻找的是新订阅者立即准备好可用的消息。我为这个概念找到了不同的名称,如prefetchPolicy
、consumerWindowSize
或"追溯消费者"。但是我不清楚哪些术语适用于Apache Artemis以及如何设置它们,因为这些示例主要是指Apache ActiveMQ。
如何配置 Artemis,以便加入新订阅的消费者获得过去的消息?
prefetchPolicy
不适用于ActiveMQ Artemis。它适用于ActiveMQ 5.x。
该consumerWindowSize
确实适用于ActiveMQ Artemis。
但是,prefetchPolicy
和consumerWindowSize
都不适用于这种情况,因为它们都与"流控制"相关,与将"错过"的消息放入 JMS 主题订阅无关。
"追溯消费者"功能适用于ActiveMQ 5.x。类似的功能(称为"追溯地址"(将在ActiveMQ Artemis 2.11中提供。它是作为ARTEMIS-2504的一部分实施的。
因此,您有以下几种选择:
- 等待ActiveMQ Artemis 2.11发布(应该在一月份发布(。
- 基于包含追溯地址功能的
master
分支构建您自己的ActiveMQ Artemis版本。 - 修改您的测试环境,以便新订阅者不必等待太长时间才能收到消息(例如,更频繁地发送消息(。