Jbpm并发子流程又一解决方案

并发子流程一直是困扰Jbpm爱好者的一大难题,JeffreyHsu 曾给出一个通过循环fork的解决方案(http://www.iteye.com/article/29917),实际上jbpm也可以使用挂接action的方式生成子流程,所有生成的子流程都由同一个rootTooken下的childrenTooken来维护

流程定义如下

xml 代码
  1. xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process-definition  xmlns=""  name="主流程">  
  4.    <start-state name="开始节点">  
  5.       <transition name="fork" to="fork">transition>  
  6.    start-state>  
  7.    <fork name="fork">  
  8.       <transition name="子流程分派" to="子流程分派节点">transition>  
  9.    fork>  
  10.    <state name="子流程分派节点">  
  11.       <transition name="结束所有子流程" to="结束所有子流程处理节点">transition>  
  12.       <transition name="子流程" to="子流程"> 
  13.       <transition name="增加子流程" to="子流程分派节点">  
  14.          <action name="创建子流程" class="createSubProcess">  
  15.             <leavename>子流程名称leavename>  
  16.          action>  
  17.       transition>  
  18.    state>  
  19.    <process-state name="子流程">  
  20.      <sub-process name="子流程名称" />  
  21.       <transition name="" to="join">  
  22.       transition>  
  23.    process-state>  
  24.    <node name="结束所有子流程处理节点">  
  25.    <event type="node-enter">  
  26.    <action name="结束所有子流程" class="killAllSubProcess" />  
  27.   event>  
  28.   <transition to="join"/>  
  29.    node>  
  30.    <join name="join">  
  31.       <transition  to="end">transition>  
  32.    join>  
  33.    <end-state name="end">end-state>  
  34. process-definition>  

class killAllSubProcess implements ActionHandler {

  public void execute(ExecutionContext executionContext) throws Exception {
   int i = 0;
   Map m = executionContext.getProcessInstance().getRootToken().getActiveChildren();
   Iterator iter = m.values().iterator();
   while( iter.hasNext() ) {
    Token t = (Token)iter.next();
    if( t.getSubProcessInstance()!=null) {
     t.getSubProcessInstance().end();
     i++;
    }
   }
  } }

class createSubProcess implements ActionHandler {

String leavename;
 
 public void execute(ExecutionContext executionContext) throws Exception {
  Token childToken = new Token( executionContext.getToken(), "TK" + ((new Random()).nextInt()) );
  ExecutionContext newctx = new ExecutionContext(childToken);
  executionContext.getTransitionSource().leave(newctx, leavename );
 }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值