这是我的路线:
<camel:endpoint id="media.retrieve.jms.inout.queue" uri="myActiveMQ:queue:RetrieveDocument?concurrentConsumers=5&replyTo=RetrieveDocument&requestTimeout=30000&disableTimeToLive=true"/>
<camel:endpoint id="media.retrieve.jms.error.queue" uri="myActiveMQ:queue:RetrieveDocument" />
<camel:endpoint id="media.retrieve.jms.processed.queue" uri="myActiveMQ:queue:RetrieveDocument" />
<camel:routeContext id="retrieveMedia">
<camel:route id="INT_DP_016-Media" routePolicyRef="routePolicy">
<camel:from uri="direct:retrieveDocument" />
<camel:onException useOriginalMessage="true">
<camel:exception>java.lang.Exception</camel:exception>
<camel:handled>
<camel:constant>false</camel:constant><!-- send exception back -->
</camel:handled>
<camel:process ref="errorHandler" />
<camel:to uri="ref:media.retrieve.jms.error.queue" />
</camel:onException>
<camel:wireTap uri="ref:media.retrieve.jms.processed.queue"/>
<camel:marshal ref="jaxbMedia" />
<camel:setProperty propertyName="outputBody">
<camel:simple resultType="java.lang.String">${body}</camel:simple>
</camel:setProperty>
<camel:setExchangePattern pattern="InOut"/>
<camel:to uri="ref:media.retrieve.jms.inout.queue" />
<camel:transacted />
<camel:process ref="mediaProcessor" />
</camel:route>
</camel:routeContext>
我在处理器( mediaProcessor )中收到异常(我的情况是预期的),之后应该等待20000 ms的Timeout(因为我发现没有收到发送的消息)。
1)我可以立即停止等待并在我的 onException 子句中处理异常吗?
2)为什么我的超时是20秒而不是30秒,因为我设置了端点选项?
更新:只是想澄清,因为可能不清楚20秒超时的位置。我有 routePolicy ,其中 org.apache.camel.spi.RoutePolicy.onExchangeDone(Route,Exchange)方法从我处理onException处理程序的那一刻起20秒后调用:
Caused by: org.apache.camel.ExchangeTimedOutException: The OUT message was not received within: 20000 millis due reply message with correlationID: Camel-ID-michael-desktop-45995-1384079313615-1-5 not received. Exchange[Message: <?xml version="1.0" encoding="UTF-8"?>...
为什么路由未在Exception处理程序中完成?为什么系统仍然认为它有一些未传递的消息?
答案 0 :(得分:0)
问题出在我的路线上,它有 ExchangePattern = InOut 但发生错误后消息转到ErrorQueue( ref:media.retrieve.jms.error.queue )等待从未来过的回复。 为OnException子句设置 ExchangePattern = InOnly 后(即当消息进入ErrorQueue时)我立即对错误做出反应而没有延迟20秒,即onException应为:
<camel:onException useOriginalMessage="true">
<camel:exception>java.lang.Exception</camel:exception>
<camel:handled>
<camel:constant>false</camel:constant><!-- send exception back -->
</camel:handled>
<camel:process ref="errorHandler" />
<camel:setExchangePattern pattern="InOnly"/><!--HERE IS A FIX-->
<camel:to uri="ref:media.retrieve.jms.error.queue" />
</camel:onException>