jBPM-4.4:fork和join的一个例子

来源:互联网 发布:python 更新包 编辑:程序博客网 时间:2024/06/05 19:06

现在,有这样一个需求:

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中,对业务流程处理进行了抽象。

上述流程对应的测试用例如下所示: