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
之上,否则它不起作用。你能换一下吗?