apache-camel - 我在 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重新投递。
让我自己测试一下。
解决方案
将异常处理逻辑移动到新路由并使用队列/直接组件来处理它。如果失败,您可以将失败的消息写入错误/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");
推荐阅读
- html - 在无序列表中,如何仅将文本与第二列的中心对齐?
- haskell - No instance of (Eq ([a] -> [a])) when pattern matching a list of functions
- c++ - 数组旋转问题(C++)- 将数组和转换次数作为用户的输入
- android - 如何修复 > 没有方法签名:build_dxc6m5s863o0nfrfjdg2bqjp.android() 适用于参数类型
- react-native - 'react-native-render-html' 不渲染和在 iOS 上符合预期,但在 Android 上确实如此
- twitter-bootstrap - 单击 data-bs-toggle="collapse" 中的文本会在单击文本时向下滚动到子级
- javascript - 在功能组件中收到错误消息“渲染不同组件时无法更新组件(`Header`)”?
- html - Reactjs 的 SEO 替代 404 状态代码
- python - pymongo - 如何按最后日期为每个客户获取单一政策并按日期对所有政策进行排序?
- python - 如何在python中安装人脸识别