Java ApacheCamel-错误处理问题

Java ApacheCamel-错误处理问题,java,error-handling,apache-camel,Java,Error Handling,Apache Camel,我在错误处理方面有问题。如果在jrnRoute中发生异常,它将由exceptionHandler处理器处理。这没关系。但是导致异常的消息仍然保留在jrnQueue中,会被再次处理并一次又一次地导致错误。此外,我在日志中有一个警告(见下文)。如何阻止无限的再交付?如果发生错误,我想扔掉一条信息 <camel:onException> <camel:exception>java.lang.Exception</camel:exception>

我在错误处理方面有问题。如果在
jrnRoute
中发生异常,它将由
exceptionHandler
处理器处理。这没关系。但是导致异常的消息仍然保留在
jrnQueue
中,会被再次处理并一次又一次地导致错误。此外,我在日志中有一个警告(见下文)。如何阻止无限的再交付?如果发生错误,我想扔掉一条信息

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
Camel配置

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>

看起来问题出在哪里

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
我通常这样做只是为了简单地处理(防止传播回调用方)、防止重试和记录错误消息

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
onException(Exception.class)
    .handled(true).maximumRedeliveries(0)
    .to("log:error processing message");

看起来问题出在哪里

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
我通常这样做只是为了简单地处理(防止传播回调用方)、防止重试和记录错误消息

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
onException(Exception.class)
    .handled(true).maximumRedeliveries(0)
    .to("log:error processing message");

是的,markRollbackOnly将导致事务管理器将TX标记为rollback,因此JMS代理将消息保留在队列中,并再次将其重新传递。所以把它去掉

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
并按照本在上面贴出的方法进行操作,处理正确:

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
 <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:handled>
            <camel:constant>true</camel:constant>
        </camel:handled>

        <camel:process ref="exceptionHandler" />
 </camel:onException>

java.lang.Exception
真的

是markRollbackOnly将导致事务管理器将TX标记为rollback,因此JMS代理将消息保留在队列中,并再次将其重新传递。所以把它去掉

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
并按照本在上面贴出的方法进行操作,处理正确:

    <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:process ref="exceptionHandler" />
        <camel:rollback markRollbackOnly="true" />
    </camel:onException>

    <camel:route id="translatorRoute">
        <camel:from ref="transactionsQueue" />
        <camel:process ref="messageTranslator" />
        <camel:inOnly ref="apfRequestQueue" />
    </camel:route>
    <camel:route id="jrnRoute">
        <camel:from ref="jrnQueue" />
        <camel:process ref="jrnProcessor" />
        <camel:stop />
    </camel:route>
</camel:camelContext>
 <camel:onException>
        <camel:exception>java.lang.Exception</camel:exception>
        <camel:redeliveryPolicy disableRedelivery="true" />
        <camel:handled>
            <camel:constant>true</camel:constant>
        </camel:handled>

        <camel:process ref="exceptionHandler" />
 </camel:onException>

java.lang.Exception
真的

谢谢。我也不知道在这种情况下秩序很重要。
camel:redeliveryPolicy
必须位于
camel:handled
之上,否则它不起作用。你能换一下吗?谢谢。我也不知道在这种情况下秩序很重要。
camel:redeliveryPolicy
必须位于
camel:handled
之上,否则它不起作用。你能换一下吗?