使用activeMQ和Broker Camel组件的无限消息传递循环

时间:2014-05-28 06:17:09

标签: apache-camel activemq

我正在使用activeMQ 5.9。

我正在尝试在activemq.xml中实现一个拦截类型路由,在那里我检查一个特定的头是否等于某个值,然后将其发送到另一个队列,否则允许它继续。

我正在关注此处的信息:http://activemq.apache.org/broker-camel-component.html

我的camel.xml文件如下所示:

<camelContext id="camel" trace="false" xmlns="http://camel.apache.org/schema/spring">
    <route id="routeAboveQueueLimitTest">
        <from uri="activemq:queue:do.something"/>
        <choice>
            <when>
                <simple>${header.scope} == 'test'</simple>
                <to uri="activemq:queue:test.do.something"/>
            </when>
            <otherwise>
                <to uri="activemq:queue:do.something"/>
            </otherwise>
        </choice>
    </route>
</camelContext>

然后当我在“activemq:queue:do.something”上添加一个名为scope =“test”的标题时,它正确地路由到“activemq:queue:test.do.something”队列。但是,当它没有那个标题时,它会将它放回“activemq:queue:do.something”队列并一次又一次地处理它!

这种看似合乎逻辑,但上面的页面清楚地表明你必须明确地将它发送回代理组件,而页面上的第二个例子显示了这一点。

我意识到如果它没有标题但是在这个阶段不合需要,可以通过将它发送到不同的队列来解决这个问题。

2 个答案:

答案 0 :(得分:0)

我认为拦截模式会更适合你正在寻找的东西。

    <intercept>
        <when><simple>${header.scope} == 'test'</simple></when>
        <to uri="activemq:queue:test.do.something"/>
    </intercept>

此处有更多信息:http://camel.apache.org/intercept.html

这将允许没有将作用域标题设置为“test”的消息继续,但会重定向具有测试标题的消息。

答案 1 :(得分:0)

InterceptSendToEndpoint是一个更好的选择...

<interceptSendToEndpoint uri="activemq:queue:do.something">
    <when><simple>${header.scope} == 'test'</simple></when>
    <to uri="activemq:queue:test.do.something"/>
    <stop/>
</interceptSendToEndpoint>