现在,有这样一个需求:
1、真正开始执行实际业务之前,因为要和多方进行交互(远程通信),需要对对外部各方进行一系列的鉴权;
2、对外部各方之间进行鉴权,存在一定的先后顺序;
3、如果某一个鉴权步骤失败,整个流程终止;
4、全部鉴权完毕后,需要收集一些数据(组装报文),为后续的业务调用提供组装报文的数据。
通过jBPM的fork和join可以很好地实现上述的需求,我们定义的流程,如下图所示:
上述流程对应的流程定义文件multiple-fork-join-process.jpdl.xml内容如下所示:
上述流程简要描述如下:
1、校验用户(CheckUser)的合法性,例如如果是远程移动支付,用户提供的手机号必须在线,而且开通了某项业务鉴权才通过,才可以进行后续的校验;
2、校验提供商品的商户(CheckMer),校验提供支付的银行(也就是支付商,CheckBank),校验提供的商品(CheckGoods),这几项是可以并行进行的(不过,貌似jBPM启动流程执行fork的时候,只能单线程执行,而无法多线程并行校验);
3、校验商户支付商关系(CheckMerBank),校验商品支付商关系(CheckGoodsBank)。由于商户支付商关系鉴权依赖于商户和支付商的校验,商品支付商关系鉴权依赖于商品和支付商的校验,所以在CheckBank结点进行了fork,然后分别和CheckMer、CheckGoods做了一个join操作;
4、校验提供商品的商户(CheckMer)与校验提供支付的银行(CheckBank)都完成后,需要将在发起远程支付交易的请求中数据都汇集,join后,在AggregateData中进行处理(例如内部报文到内部报文的转换操作)。
对于每个结点(这里只上述流程定义中的custom对应的处理类)要进行的处理,完全可以自己模拟,例如,我的com.umpay.ubp.jbpm.handler.PrintInfoHandler的继承关系如下所示:
在AbstractHandler中,对业务流程处理进行了抽象。
上述流程对应的测试用例如下所示: