我使用ActiveMQ的compositeTopic
将消息扇出到多个目的地,如下所示:
<broker>
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
...
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeTopic name="fan-out" forwardOnly="true">
<forwardTo>
<queue physicalName="persistent"/>
<queue physicalName="ephemeral"/>
</forwardTo>
</compositeTopic>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
</broker>
所以,我想同时将消息转发到persistent
和ephemeral
队列。正如您可能从他们的名字中猜到的那样,我希望persistent
队列中的消息是持久的,我不需要ephemeral
队列的持久性。问题是ActiveMQ没有基于每个目的地的持久性概念,是吗?可以为整个代理设置持久性,或使用持久性/非持久性传递模式。所以,问题是:在这种情况下如何禁用ephemeral
队列的持久性?
答案 0 :(得分:3)
因此,似乎有效的解决方案是将Apache Camel与ActiveMQ一起使用。只需添加一条将ephemeral
队列排入另一个队列设置TTL /持久模式的路由:
<broker>
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
...
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeTopic name="fan-out" forwardOnly="true">
<forwardTo>
<queue physicalName="persistent"/>
<queue physicalName="ephemeral"/>
</forwardTo>
</compositeTopic>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
</broker>
<camelContext xmlns="http://camel.apache.org/schema/spring" id="camel">
<route>
<from uri="activemq:queue:ephemeral"/>
<to uri="activemq:queue:ephemeral-backend?timeToLive=10000"/>
</route>
</camelContext>
timeToLive
是消息的TTL,以毫秒为单位。在上面的配置中,消息仍然是持久性的:在TTL过期后,它们将被移动到DLQ。如果你想扔掉它们,那么配置应该包含deliveryPersistent
设置为false
:
<camelContext xmlns="http://camel.apache.org/schema/spring" id="camel">
<route>
<from uri="activemq:queue:ephemeral" />
<to uri="activemq:queue:ephemeral-backend?timeToLive=10000&deliveryPersistent=false" />
</route>
</camelContext>