在异常后的Request / Reply处停止等待队列

时间:2013-11-10 10:36:45

标签: jms apache-camel

这是我的路线:

<camel:endpoint id="media.retrieve.jms.inout.queue" uri="myActiveMQ:queue:RetrieveDocument?concurrentConsumers=5&amp;replyTo=RetrieveDocument&amp;requestTimeout=30000&amp;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处理程序中完成?为什么系统仍然认为它有一些未传递的消息?

1 个答案:

答案 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>