camel系列-理解错误处理
理解错误处理
在走进 Camel 错误处理的世界之前,我们需要退一步,看看更普遍的错误。首先,错误一般分为两大类:可恢复的错误和不可恢复的错误。其次我们需要看看何时何地开始错误处理,因为错误的发生是有先决条件的。
可恢复的错误和不可恢复的错误
当涉及到的错误,我们可以将他们分为可恢复的错误和不可恢复的错误,如图所示。
- 不可恢复的错误是指一个错误,无论你尝试多少次相同的操作,它仍是一个错误。在集成的项目中,这可能意味着试图访问的数据库表不存在,这将导致 JDBC 驱动程序抛出 SQLException 异常。
- 可恢复的错误,是一个临时错误,在接下来的尝试操作后,可能并不会再次出现这个错误。比如网络连接错误导致的 java.io.IOException。在接下来的尝试操作后,网络问题可能已经解决了,您的应用程序可以继续运行。
作为一个 Java 开发人员在日常生活中,你可能会遇到这样的错误分类: 可恢复的错误和不可恢复的错误。一般来说,异常处理代码使用两种分类之一,如下面两个代码片段所示。
第一个代码片段演示了一个常见的错误处理方式,将所有的异常认为是不可恢复的,放弃进一步的尝试,直接向调用者返回异常:
1 | public void handleOrder(Order order) throws OrderFailedException { |
下一个片段通过添加一些处理改善了这种情况,在抛出异常之前进行的尝试,尝试 5 次后,如果仍然失败,抛出异常:
1 | public void handleOrder(Order order) throws OrderFailedException { |
上面的例子都缺少对错误类型的验证,即发生的错误时可恢复的还是不可恢复的?进而采取相应的措施。可恢复的情况下,你可以再试一次,不能恢复的情况下,你可以立即放弃并重新抛出异常。
在 Camel 中,可恢复的错误由 Throwable 和 Exception 代表,可以通过 org.apache.camel.Exchange 类中的下面两个方法进行存取:
1 | void setException(Throwable cause); |
不可恢复的错误由一个消息代表,此消息有一个错误标识,此标识可以通过 org.apache.camel.Exchange 来存取。例如,设置”Unknown customer”作为一个错误消息,可以这么做:
1 | Message msg = Exchange.getOut(); |
错误标识必须使用setFault(true)
方法设置。
那么,在 Camel 中,为什么这两种类型的错误代表不同?原因有两个:第一,Camel API 的设计符合 JBI(Java 业务集成)规范,此规范中有个错误消息的概念。第二,Camel 核心包中内置了错误处理,所以,只要 Camel 中抛出异常,Camel 都可以捕获它,并把它设置到 Exchange 中作为可恢复错误,如下:
1 | try { |
使用这种模式允许 Came 捕获和处理所有异常。Camel 的错误处理机制就可以决定如何处理捕获的错误–重试,传播错误返回给调用者,或者做别的事情。Camel 的终端用户可以将不可恢复的错误设置为错误消息,Camel 能做出相应的反应,停止路由该消息。
现在你已经了解了可恢复和不可恢复的错误,让我们总结下他们在 Camel 中是如何表示的:
1、异常(Exceptions)表示为可恢复错误。
2、错误信息表示为不可恢复的错误。
现在让我们看看 Camel 在何时何地进行错误处理。
Camel 进行错误处理的位置
Camel 的错误处理不会应用于任何地方。要理解为什么,请看图:
图 Camel 的错误处理仅适用于一个 exchange 的生命周期之内。
图显示了一个简单的文件转换路由。使用一个文件消费者和生产者作为路由的输入和输出,在两者之间是 Camel 的路由引擎,将路由信息打包进一个 exchange。Camel 的错误处理适用于这个 exchange 的生命周期之内。这样就给了输入方一些处理错误的操作空间—文件消费者必须保证能够成功读取文件,初始化 Exchange 对象以及在 Camel 错误处理机制运行之前启动路由。这适用于任何类型的 Camel 消费者。
那么当文件消费者不能成功读取文件时,将会发生什么呢?答案是以组件而定,每一个 Camel 组件都必须有处理这种情况的方式。一些组件可能会忽略这个消息,其他组件可能会尝试一定的次数,还有一些组件可能会优雅地恢复这个错误。
提示:许多 Camel 组件都提供了自己的错误处理特性:File, FTP, Mail, iBATIS, RSS, Atom, JPA, 以及 SNMP 组件。这些组件都是基于 ScheduledPollConsumer 类的,这个类提供了可插拔的 PollingConsumerPollStrategy 策略,你可以利用它创建你自己的错误处理策略。在 Camel 的网站上你可以了解更多这方面的内容: http://camel.apache.org/polling-consumer.html.
了解这些背景资料就足够了—-让我们开始深入研究 Camel 的错误处理机制是如何工作的。在下一节,我们将看到 Camel 的一系列错误处理器。