【问题标题】:Apache Camel - problem with error handlingApache Camel - 错误处理问题
【发布时间】:2011-11-22 17:34:18
【问题描述】:

我遇到了错误处理问题。如果jrnRoute 发生异常,则由exceptionHandler 处理器处理。还行吧。但是导致异常的消息仍然保留在jrnQueue 中,被再次处理并一遍又一遍地导致错误。此外,我在日志中有一个警告(见下文)。如何阻止无限重发?如果出现错误,我想扔掉一条消息。

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 com.swiftmq.jms.ObjectMessageImpl@c84d9d
messageIndex = 5_2
messageId = [LazyUTF8String, s=ID:/172.26.214.11/5349789614428334512/10/0, buffer=[B@5f7fd8]
userId = [LazyUTF8String, s=null, buffer=[B@1c254aa]
clientId = null
timeStamp = 1316682898526
correlationId = null
replyTo = null
destination = jrnQueue@z4smq_4001
deliveryMode = 2
redelivered = true
deliveryCount = 8
type = null
expiration = 0
priority = 4
props = {...}
readOnly = true
sourceRouter = null
destRouter = null
destQueue = null array=[B@1447e6b 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 com.swiftmq.jms.ObjectMessageImpl@c84d9d
messageIndex = 5_2
messageId = [LazyUTF8String, s=ID:/172.26.214.11/5349789614428334512/10/0, buffer=[B@5f7fd8]
userId = [LazyUTF8String, s=null, buffer=[B@1c254aa]
clientId = null
timeStamp = 1316682898526
correlationId = null
replyTo = null
destination = jrnQueue@z4smq_4001
deliveryMode = 2
redelivered = true
deliveryCount = 8
type = null
expiration = 0
priority = 4
props = {...}
readOnly = true
sourceRouter = null
destRouter = null
destQueue = null array=[B@1447e6b cnt=1295]]

【问题讨论】:

    标签: java error-handling apache-camel


    【解决方案1】:

    看起来markRollbackOnly="true" 是问题所在......

    我通常会做这样的事情来简单地处理(防止传播回调用者)、防止重试和记录错误消息...

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

    【讨论】:

      【解决方案2】:

      是的,markRollbackOnly 将导致事务管理器将 TX 标记为回滚,因此 JMS 代理会将消息保留在队列中,然后再次重新传递。所以删除它。

      按照上面 Ben 发布的方法进行操作,处理为 true:

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

      【讨论】:

      • 谢谢。我也不知道在这种情况下顺序很重要。 camel:redeliveryPolicy 必须高于camel:handled,否则不起作用。可以改一下吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 2013-10-17
      • 1970-01-01
      • 2020-06-18
      相关资源
      最近更新 更多