在骆驼中捕获异常

时间:2015-11-17 08:31:34

标签: java apache-camel

我在骆驼中有一条路线如下

errorHandler(deadLetterChannel("file:somelocation");

            from("jms:queuwlocation").to(
                    "file:someLocation");

我已经读过,当处理器,谓词等两个节点之间进行处理时,会出现骆驼错误处理。但是,如果我不能使用该消息,在我的情况下,骆驼无法连接到jms。我应该如何记录此异常?因为我试图使用deadLetterChannel将消息发送到文件系统,但由于我没有收到消息,因此文件位置没有任何新内容。我应该怎么遇到这种情况?

2 个答案:

答案 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)

据我所知,错误处理不会在节点之间发挥作用。它的范围比这更完整。它还取决于您所面临的错误类型。

如何记录异常?

那你为什么不这样做?

  1. 定义了DeadLetterChannel,并在CamelContext上引用它。
  2. deadletteruri指的是另一条路线 - 称之为错误处理路线。
  3. 在错误处理程序路由中,您可以设置包含错误的标头以及您要设置的其他信息。
  4. 在“to”中的错误处理程序路由中,将错误消息发送到使用它写入标题的文件,就像使用日志文件一样。