我正在使用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”队列并一次又一次地处理它!
这种看似合乎逻辑,但上面的页面清楚地表明你必须明确地将它发送回代理组件,而页面上的第二个例子显示了这一点。
我意识到如果它没有标题但是在这个阶段不合需要,可以通过将它发送到不同的队列来解决这个问题。
答案 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>