首页 > 解决方案 > 我在 apache camel 中处理 onException(真)的设计有问题

问题描述

onException(NullPointerException.class)
    .handled(true)
    .to("google-pubsub:some_topic");

在这里,我的设计是对于任何不可预见的错误,我想将问题消息放到 gcp pubsub 错误主题。

但我说的是“已处理”为真。因此,对于发布到 pubsub 错误主题的任何错误(例如网络错误等),该错误将被默默忽略!这对我没有好处。现在我丢失了消息,因为自从它被处理以来,消息已经被自动确认并且消息不会被 gcp pubsub 重新传递!

请让我知道我的替代方案


我刚刚浏览了骆驼行动手册。下面是正文

“Camel 在处理错误时不允许进一步的错误处理(onException 处理为真)。换句话说,当 Camel 检测到在错误处理期间引发了另一个异常时,它会阻止任何进一步的操作发生。这是由org.apache.camel.processor.FataFallbackErrorHandler,它捕获新异常,记录警告,将其设置为 Exchange 上的异常,并停止任何进一步的路由。”

这意味着如果在处理异常时抛出异常,则异常不会传播,但会记录警告并在交换上设置异常。

由于在exchange中标记了错误,exchange中的pub sub消息不会被标记为acked,会被pubsub重新投递。

让我自己测试一下。

标签: apache-camelgoogle-cloud-pubsub

解决方案


将异常处理逻辑移动到新路由并使用队列/直接组件来处理它。如果失败,您可以将失败的消息写入错误/dlq,并提出重新处理它们的策略。

主要路线:

onException(Exception.class)
.handled(true)
.to("queue:myapp.exception.handler");

from(direct:mainRoute")
   .process("processTransaction")
   .to("sql:***");    

异常处理程序路线:

onException(Exception.class)
   .handled(true)  
   .maximumRedeliveries(2)
   .redeliveryDelay(30000)
   .to("queue:myapp.exception.handler.failed") ;
      
from("queue:myapp.exception.handler")
    .to("google-pubsub:some_topic"); 
     


   
 

推荐阅读