ActiveMQ compositeTopic的选择性持久性

时间:2016-02-17 17:39:48

标签: java jms persistence activemq

我使用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>

所以,我想同时将消息转发到persistentephemeral队列。正如您可能从他们的名字中猜到的那样,我希望persistent队列中的消息是持久的,我不需要ephemeral队列的持久性。问题是ActiveMQ没有基于每个目的地的持久性概念,是吗?可以为整个代理设置持久性,或使用持久性/非持久性传递模式。所以,问题是:在这种情况下如何禁用ephemeral队列的持久性?

1 个答案:

答案 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&amp;deliveryPersistent=false" />
  </route>
</camelContext>