`
zpfadmin
  • 浏览: 41454 次
社区版块
存档分类
最新评论

JBPM3动态分支的实现

    博客分类:
  • JBPM
阅读更多

有朋友也遇到这方面的问题,我就贴个贴子,不再一一回复了,参考了论坛上的一些资料,代码如下:

 

public class ForkManageActionHandler implements ActionHandler {

 public void execute(ExecutionContext executionContext) throws Exception {
  
  ProcessInstance pi = executionContext.getProcessInstance();
  ContextInstance ci = executionContext.getContextInstance();
  Token rootToken = pi.getRootToken();
  ForkVariableVo  forkVariableVo = (ForkVariableVo)ci.getVariable(Constants.FORK_VARIABLE_VO);
    
  //角色发送和多人签收分支
  if(forkVariableVo.isRoleSend() && forkVariableVo.isMorePeopleSign()){
   
   Node node = rootToken.getNode();
   List<String> sendUserList = new ArrayList<String>() ;
   List<ForkedTransition> forkTransitions = new ArrayList<ForkedTransition>();
   Map<String,String> roleSendAndMorePeopleMap = forkVariableVo.getRoleSendAndMorePeople();
   
   for(int j=0;j<node.getLeavingTransitions().size();j++){
    Transition trans = (Transition)node.getLeavingTransitions().get(j);
    
    //考虑到有多个角色发送和多人签收的分支情况,MAP过滤,获取动态分支用户
    String activityId = trans.getName() ;
    if(roleSendAndMorePeopleMap.get(activityId)!=null){
     if(forkVariableVo.mOfficeTargetUser.get(activityId)!=null){
      sendUserList = (List<String>)forkVariableVo.mOfficeTargetUser.get(activityId);
     }else{
      sendUserList = (List<String>)forkVariableVo.noMOfficeTargetUser.get(activityId);
     }
    }
    if(sendUserList ==null || sendUserList.size() ==0){
     continue;
    }
    //创建分支Token及Transition
    for(int i=1; i<sendUserList.size(); i++){
     String tokenName = this.getTokenName(rootToken,  activityId, i);
     Token loopToken = new Token(rootToken,tokenName);
     loopToken.setTerminationImplicit(true);
     executionContext.getJbpmContext().getSession().save(loopToken);
     
     ExecutionContext newExecutionContext = new ExecutionContext(
       loopToken);
     //newExecutionContext.getContextInstance().createVariable(String.valueOf(i),
     //(String)sendUserList.get(i), loopToken);
 
     // 记录下每一transition
     ForkedTransition forkTransition = new ForkedTransition();
     forkTransition.executionContext = newExecutionContext;
     forkTransition.transition = trans;
     forkTransitions.add(forkTransition);
    } 
    sendUserList = null ;
   }
   for (ForkedTransition forkTransition : forkTransitions) {
    node.leave(forkTransition.executionContext, forkTransition.transition);
   }
  } 
 }

 /**
  * 获取Token名称
  * @param parent
  * @param transitionName
  * @param loopIndex
  * @return
  */
 protected String getTokenName(Token parent, String transitionName,int loopIndex) {
  String tokenName = null;
  if (transitionName != null) {
   if (!parent.hasChild(transitionName)) {
    tokenName = transitionName;
   } else {
    int i = 2;
    tokenName = transitionName + Integer.toString(i);
    while (parent.hasChild(tokenName)) {
     i++;
     tokenName = transitionName + Integer.toString(i);
    }
   }
  } else {
   // 没有转向
   int size = (parent.getChildren() != null ? parent.getChildren()
     .size() + 1 : 1);
   tokenName = Integer.toString(size);
  }
  return tokenName + "." + loopIndex;
 } 
 
 private class ForkedTransition {  
  private ExecutionContext executionContext;
  private Transition transition;
 }
}

在FORK节点的node-enter中配置该ACTION类,凭借原来那条分支,根据发送的用户的LIST,动态去构建TOKEN,每个TOKEN指向其原分支上的transition,中间那部分角色发送是我自己的需求而写的,重要的是创建分支这一部分。

分享到:
评论

相关推荐

    jbpm4.4学习笔记

    3 Jbpm4.4介绍 7 3.1工作流引擎 8 3.2jpdl 8 3.3数据库 8 3.3.1资源库和运行时表结构 8 3.3.2历史数据库表 9 3.3.3身份认证表 9 3.4jbpm.cfg.xml 9 3.5 jbpm.hibernate.cfg.xml 10 3.6logging.properties 10 4 准备...

    JBPM4.4用户手册.doc

    使用 fork实现并行分支 6.2.5. end结束 6.2.5.1. end process instance结束流程处理实例 6.2.5.2. end execution结束流向 6.2.5.3. end multiple多个结束 6.2.5.4. end State结束状态 6.2.6. task 6.2.6.1. 任务...

    JBPM4工作流应用开始指南.rar

    包括jBPM4扩展研发先决条件、深入jPDL和jBPM Service API、升级jBPM3到jBPM4、流程虚拟机原理、jBPM4的设计思想、随需而配jBPM4、异步工作执行器、深入jBPM4电子邮件支持、系统日志、jBPM4与Spring框架集成、jBPM4与...

    工作流概念及模型的研究(学士学位论文)

    3.工作流模型 26 3.1 起点模型 26 3.1.1单起点 26 3.1.2 多起点 27 3.2路由模型 28 3.2.1基本路由 28 3.2.2分支路由 29 3.2.3聚合路由 30 3.2.4循环路由 31 3.2.5嵌套路由 32 3.3 激活模型 34 3.3.1流程激活 34 ...

    activiti-5.22.0.zip快速下载绿色下载

    创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。 Activiti是一个独立运作和经营的开源项目品牌,并将独立于...

    Activiti-5.23.0-release源代码

    创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。 Activiti是一个独立运作和经营的开源项目品牌,并将独立于...

    activiti 5.13用户手册

    创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。 Activiti是一个独立运作和经营的开源项目品牌,并将独立于...

    开源工作流框架activiti5.6

    创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。 Activiti是一个独立运作和经营的开源项目品牌,并将独立...

    activiti5.1.3

    创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。 Activiti是一个独立运作和经营的开源项目品牌,并将独立于...

    activiti-5.7

    创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。 Activiti是一个独立运作和经营的开源项目品牌,并将独立...

    Spring攻略(第二版 中文高清版).part2

    1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 ...

    Spring攻略(第二版 中文高清版).part1

    1.1.3 工作原理 3 1.2 配置Spring IoC容器中的Bean 4 1.2.1 问题 4 1.2.2 解决方案 4 1.2.3 工作原理 4 1.3 调用构造程序创建Bean 14 1.3.1 问题 14 1.3.2 解决方案 14 1.3.3 工作原理 14 1.4 ...

    我国GIS软件的发展现状

    地理信息产业是信息产业的一个重要组成部分,地理信息技术是IT技术的一个重要分支,地理信息系统软件是一类特殊的计算机信息系统软件,它是以各类空间数据及其属性为基础,为各种应用目的服务的一类计算机信息系统。...

Global site tag (gtag.js) - Google Analytics