2011-09-22 297 views
1

我遇到错误处理问题。如果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]] 

回答

3

是在markRollbackOnly会导致事务管理器,以纪念TX为回滚,因此JMS代理将保持消息队列,并再次重新发送。所以删除它。

,做作为本上面贴有办理真:

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

谢谢。在这种情况下,我也不知道这个顺序很重要。 'camel:redeliveryPolicy'必须在'camel:handled'之上,否则不起作用。你能改变它吗? – user219882

2

貌似markRollbackOnly="true"是问题...

我通常不喜欢这样简单地处理(防止传播回调用者),防止重试和日志错误消息...

onException(Exception.class) 
    .handled(true).maximumRedeliveries(0) 
    .to("log:error processing message");