2. BPEL业务流程中的异常处理
首先,我们在定义流程所实现的接口操作的时候可以定义异常,使得异常可以抛出给流程的调用方。WPS接口中的操作分为两类:单向操作(One-Way Operation)和双向操作(Two-Way Operation)。单向操作只发出调用,不关心调用结果的返回,因此无法在接口上定义异常的抛出。双向操作发出调用之后会等待调用的完成和结果的返回,可以在接口上定义异常的抛出。如下图所示:

图 1. 接口操作上的错误定义
在业务流程(Business Process)中,可以使用错误处理器(Fault Handler)来对异常进行处理。错误处理器可以在Invoke,Scope和Receive三种结点上使用。在Invoke上定义的错误处理器处理此次调用返回的异常;在Scope上定义的错误处理器处理在这个scope里的结点运行期间抛出的错误,在Receive上定义的错误处理器则处理整个业务流程中抛出的错误。
错误处理器对异常的处理是按层次由内向外抛出的。例如如果一个Invoke结点是定义在一个Scope之内的,那么Invoke产生的异常首先由Invoke上定义的错误处理器处理,如果此错误处理器未能捕获或者再次抛出这个异常,那么异常由Scope上定义的错误处理器处理,如果再次抛出,那么由Receive结点上定义的全局错误处理器进行处理。如果异常未能在流程范围能得到处理,可以返回给接口操作的调用方。
业务流程中三种结点上的错误处理器情况分别如下列图形所示:

各种结点上的错误处理器的具体配置如下所示:
图 5.

此处可以选择错误的类型:Built-in和User-defined。Built-in包括一些系统预先定义的常见异常类型,如空指针错误类型等。User-defined指用户自己定义的业务异常类型,这些异常应当在定义接口的时候在方法里予以定义,如图1所示。
在一个错误处理器里,可以添加多个Catch结点去捕获多种不同类型的错误,也可以使用Catch All结点去捕获所有错误。
捕获了错误之后,常见的处理错误办法有:
1)将其再次抛出至外一层异常处理体(如果直至整个流程级都没有相应的异常捕获体,那么流程实例将进入失败状态);
2)启动一个人工任务,发起对于错误的人工干预;
3)启动补偿;
4)调用一个Reply结点,将错误返回(这种情况需要在流程接口上定义错误处理)。
此外,还有两处需要注意的地方:
关于“Continue On Error”
在大多数结点的属性栏的Server页面上,有一个选项叫做“Continue On Error”,如下图所示:

图6. Continue On Error选项
如果选中此选项的话,则一旦此结点出错,流程抛出一个错误并且继续;如果未选中的话,流程会暂停当前活动,为流程管理员创建一个工作项,允许他重新尝试这个结点,如果仍然失败,则流程实例失败。
在流程里可以通过Java Snippet来取得当前流程出错的详情
示例代码如下:
com.ibm.bpe.api.BpelException bpelexception = getCurrentFaultAsException();
QName faultName =
new QName("http://FaultHandlingSampleModule", "JavaSnippetException");
raiseFault(faultName);