目录
阅读时间: 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中可用的错误处理程序的类型以及何时有效地使用它们。