我在骆驼中有一条路线如下
errorHandler(deadLetterChannel("file:somelocation");
from("jms:queuwlocation").to(
"file:someLocation");
我已经读过,当处理器,谓词等两个节点之间进行处理时,会出现骆驼错误处理。但是,如果我不能使用该消息,在我的情况下,骆驼无法连接到jms。我应该如何记录此异常?因为我试图使用deadLetterChannel将消息发送到文件系统,但由于我没有收到消息,因此文件位置没有任何新内容。我应该怎么遇到这种情况?
答案 0 :(得分:1)
您遇到的问题可能是由于JMS连接异常被抛出Camel交换的生命周期之外。 Claus Ibsen 在“行动中的骆驼”中提到了这一点。作为鸡和鸡蛋的情况:
你可以把它描绘成鸡蛋和鸡蛋的情况。 Camel的错误处理程序仅适用 在路由交换(鸡)期间,但消费者需要成功创建 交换(孵化蛋)。因此,如果我们想要一只鸡但只有一个鸡蛋,我们能做些什么呢?
答案在于扩展错误处理边界以覆盖整个Camel JMS使用者:
作为 一个比喻我们可以告诉Camel将鸡蛋视为鸡只。这是通过 配置使用者使用Camel的错误处理程序桥接其内部错误处理程序。
对于JMS模块,我怀疑这涉及到使用transferException
属性。祝你好运!
此外,我不认为使用deadletter渠道适合您的问题,因为在遇到连接问题时,您无法从队列中取出任何内容
通常,连接问题是自我修复,例如服务器重新启动,可以通过重试解决。对于您的用例,合理的重新传递策略可以做到这一点。幸运的是,Camel非常擅长:https://camel.apache.org/redeliverypolicy.html。
我建议无限期重新发送,直到连接开始。像这样:
onException(SomeJmsTimeoutException.class, SomeJmsConnectivityException.class)
.useOriginalMessage()
.maximumRedeliveries(Integer.MAX_VALUE)
.retryAttemptedLogLevel(LoggingLevel.ERROR)
.logRetryStackTrace(true)
.redeliveryDelay(1000 * 60);
答案 1 :(得分:0)
据我所知,错误处理不会在节点之间发挥作用。它的范围比这更完整。它还取决于您所面临的错误类型。
如何记录异常?
那你为什么不这样做?