我遇到错误处理问题。如果jrnRoute
发生异常,则由exceptionHandler
处理器处理。还行吧。但是引起异常的消息仍然停留在jrnQueue
,再次处理并且一遍又一遍地导致错误。此外,我还在日志中发出警告(请参阅下文)。如何阻止无限的重新交付?如果发生错误,我想丢掉信息。Apache Camel - 错误处理问题
Camel configuration
<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>
Warning
11:15:00,141 WARN [JmsMessageListenerContainer] Execution of JMS message listener failed, and no ErrorHandler has been set.
org.apache.camel.RuntimeCamelException: org.apache.camel.RollbackExchangeException: Intended rollback. Exchange[JmsMessage: [ObjectMessageImpl [email protected]
messageIndex = 5_2
messageId = [LazyUTF8String, s=ID:/172.26.214.11/5349789614428334512/10/0, buffer=[[email protected]]
userId = [LazyUTF8String, s=null, buffer=[[email protected]]
clientId = null
timeStamp = 1316682898526
correlationId = null
replyTo = null
destination = [email protected]_4001
deliveryMode = 2
redelivered = true
deliveryCount = 8
type = null
expiration = 0
priority = 4
props = {...}
readOnly = true
sourceRouter = null
destRouter = null
destQueue = null array=[[email protected] cnt=1295]]
at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1145)
at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:108)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:560)
at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:498)
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:243)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: org.apache.camel.RollbackExchangeException: Intended rollback. Exchange[JmsMessage: [ObjectMessageImpl [email protected]
messageIndex = 5_2
messageId = [LazyUTF8String, s=ID:/172.26.214.11/5349789614428334512/10/0, buffer=[[email protected]]
userId = [LazyUTF8String, s=null, buffer=[[email protected]]
clientId = null
timeStamp = 1316682898526
correlationId = null
replyTo = null
destination = [email protected]_4001
deliveryMode = 2
redelivered = true
deliveryCount = 8
type = null
expiration = 0
priority = 4
props = {...}
readOnly = true
sourceRouter = null
destRouter = null
destQueue = null array=[[email protected] cnt=1295]]
谢谢。在这种情况下,我也不知道这个顺序很重要。 'camel:redeliveryPolicy'必须在'camel:handled'之上,否则不起作用。你能改变它吗? – user219882