Jms 在异常后请求/答复时停止等待队列

Jms 在异常后请求/答复时停止等待队列,jms,apache-camel,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="medi

这是我的路线:

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

java.lang.Exception
假的
${body}
我在我的处理器(mediaProcessor)中收到异常(我的情况下应该是这样),之后应该等待20000毫秒超时(因为据我所知,并没有收到发送的消息)

1) 我可以立即停止等待,只处理我的OneException子句中的异常吗

2) 为什么我的超时时间是20秒,而不是在端点选项设置时的30秒

更新:只是想澄清一下,因为可能不清楚20秒超时的位置。我有routePolicy,其中org.apache.camel.spi.routePolicy.OneExchangeDone(路由,交换)方法从处理OneException处理程序开始的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"?>...
原因:org.apache.camel.ExchangeMedOutException:未在20000毫秒内收到OUT消息,相关ID为:camel-ID-michael-desktop-45995-1384079313615-1-5的到期回复消息未收到。交换[信息:。。。

为什么路由没有在异常处理程序中完成?为什么系统仍然认为它有一些未传递的消息?

问题出在我的路由中,它有ExchangePattern=InOut,但在发生错误后,消息进入ErrorQueue(ref:media.retrieve.jms.error.queue)并等待从未出现的回复。 在为OneException子句设置ExchangePattern=InOnly后(即当消息进入ErrorQueue时),我立即对错误做出反应,无需20秒延迟,即OneException应为:

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

java.lang.Exception
假的