Apache Camel - 错误处理

697 阅读6分钟

目录

阅读时间: 4 分钟

[

在Apache Camel系列中,我们已经走过了一半的路程。但是,在这篇博客中,你将解决集成中最困难的一个方面:处理意外情况。

当涉及到处理意外发生时,开发集成不同系统的应用程序是很困难的。你可以在一个你完全控制的单一系统中管理这些发生的情况并恢复。同样,网络连接的系统也面临着额外的风险:网络连接可能会丢失,远程系统可能无法及时响应,也可能没有明显的原因而失效。意外的事件,如服务器的磁盘填满或内存耗尽,甚至可能发生在你的本地服务器上。无论发生哪种类型的错误,你的程序都应该有能力处理它。

在这些情况下,日志文件有时是突发事件的唯一证据,因此,日志记录是至关重要的。Camel提供了强大的日志和错误处理功能,确保你的应用程序可以继续运行。

了解如何处理错误

可恢复和不可恢复的错误

无论你尝试完成多少次相同的操作,不可恢复的错误仍然是一个错误。在集成世界中,这可能意味着试图访问一个不存在的数据库表,从而导致JDBC驱动程序的SQLException。
另一方面,一个可恢复的错误是一次性发生的,在随后的尝试中可能会或可能不会导致问题。同样,这种错误的一个很好的例子是网络连接的困难,导致了java.io.IOException。我们可以在以后的尝试中解决网络问题,而你的程序可能继续运行。

让我们回顾一下我们如何在Camel中表示可恢复和不可恢复的故障,现在你已经看到它们的作用了。

  • 我们使用Exceptions来表达可恢复的错误。
  • 同样,我们使用Fault消息来表达不可恢复的错误。

Camel错误处理程序

Camel认为所有的异常都是可恢复的异常。同时,这些类型的异常通过setException(Throwable cause)方法被存储在交易所。这意味着Camel的错误处理程序将只响应在交易所中产生的异常。根据经验法则,Camel的错误处理程序只有在有交换时才会被触发,getException()不等于null。

Camel有许多错误处理程序可供选择

错误处理程序描述
DefaultErrorHandler如果没有定义其他错误处理程序,这是默认的错误处理程序,会自动启用。
死信通道(DeadLetterChannel死信通道EIP是由这个错误处理程序实现的。
TransactionErrorHandler这是默认错误处理程序的一个扩展,是事务感知的。
NoErrorHandler这个处理程序用于完全禁用错误处理。
LoggingErrorHandler这个错误处理程序除了记录异常之外,没有做其他事情。这个错误处理程序不再被推荐;相反,使用DeadLetterChannel错误处理程序,将日志端点作为目标。

错误处理程序

虽然有五个错误处理程序一开始可能会令人望而生畏,但你会发现默认的错误处理程序在大多数情况下都是救星。
前三个错误处理程序扩展了RedeliveryErrorHandler类。这个类中有主要的错误处理功能,对这三个处理程序非常有用。最后两个错误处理程序没有扩展RedeliveryErrorHandler,其功能受到限制。

错误处理程序的细节

默认错误处理程序

Camel有DefaultErrorHandler,它涵盖了绝大部分的情况。另外,我们不必提及默认处理程序。这些是默认错误处理程序的设置。

  • 没有重新交付。
  • 原始调用者得到异常的回报。
  • 日志得到异常的堆栈跟踪报告。
  • 日志得到交换的路由的打印历史。

当路由异常发生时,默认的行为是记录一个路由历史,追踪到Camel路由交换的步骤。这可以让你立即找出路由中发生错误的地方。Camel还记录了有关当前交换的信息,如消息文本和标题。

死信通道错误处理程序

DeadLetterChannel是一个错误处理程序,实现了Dead Letter Channel EIP的原则。根据这种模式,如果一个消息没有被处理或发送,该消息应该到达死信队列。

DeadLetterChannel错误处理程序与默认错误处理程序相当,但有以下例外。

  • 与通常的错误处理程序不同,死信通道默认处理异常,并将不成功的消息移到死信队列中。
  • 在处理异常时,死信通道被设置为默认不记录任何活动。
  • 当一个消息被移到死信队列时,死信通道支持使用原始输入消息。
  • 死信通道是唯一的错误处理程序,它允许失败的消息移动到一个单独的错误队列,称为死信队列。

事务错误处理程序

TransactionErrorHandler是一个围绕默认错误处理程序的包装器,提供与默认错误处理程序相同的功能。TransactionErrorHandler以更多的优化来实现事务性路由。

没有错误处理程序

我们也可以使用NoErrorHandler禁用错误处理,因为Camel目前的架构也支持。如果你想禁用错误处理,你必须提供一个错误处理程序,它基本上是一个没有逻辑的空壳。这就是NoErrorHandler类。

记录错误处理程序

我们可以用LoggingErrorHandler的例外来一起记录不成功的消息。该记录器使用log4j、commons logging和Java Util Logger作为记录套件。
Camel将默认使用org.apache.camel.processor的日志名称报告失败消息和异常。
在ERROR级别,有一个LoggingErrorHandler。当然,你可以把它变成你自己的。
当我们使用死信道错误处理程序和一个日志端点作为目标时,我们可以替换日志错误处理程序。因此,日志错误处理程序会被错开,而有利于这个方法。

总结

在这篇博客中,我们已经了解了Apache Camel中可用的错误处理程序的类型以及何时有效地使用它们。