`
wuxufeng8080
  • 浏览: 49612 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

相同功能的循环节点(jbpm应用)

    博客分类:
  • jBPM
阅读更多

在企业应用中,会有很多这样的情况,一个人起草之后,会需要他的上级一级一级的签,直到签到符合要求的那个主管等级,然后结束。这种情况,有不过不固定,因为每个人的上级不一样,所以如果要把这个图都画出来的话及其复杂,这样就有了以下的构思。通过同一个node的循环,来实现这种需要上级签合的情况。

下面是一个我们公司的资讯申请单流程

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process-definition xmlns="urn:jbpm.org:jpdl-3.1"  
  4.     name="IT_InformationRequisition">  
  5.   
  6.     <swimlane name="user" />  
  7.        
  8.     <swimlane name="userHandler">  
  9.         <assignment class="com.ivo.engine.wf.swinlane.UserSwimlane" />  
  10.     </swimlane>  
  11.     <swimlane name="handler">  
  12.         <assignment class="com.ivo.engine.wf.swinlane.HandlerSwimlane" />  
  13.     </swimlane>  
  14.     <swimlane name="handlerClose">  
  15.         <assignment class="com.ivo.engine.wf.swinlane.HandlerCloseSwimlane" />  
  16.     </swimlane>  
  17.     <swimlane name="leader">  
  18.         <assignment class="com.ivo.engine.wf.swinlane.DomainLeaderSwimlane" />  
  19.     </swimlane>  
  20.     <swimlane name="userManager">  
  21.         <assignment class="com.ivo.engine.wf.swinlane.UserManagerSwimlane" />  
  22.     </swimlane>  
  23.        
  24.     <start-state name="start">  
  25.         <task swimlane="user">      </task>  
  26.         <transition name="draft" to="Drafting"></transition>  
  27.       <transition name="accept" to="HandlerAcceptance"></transition>  
  28.     </start-state>  
  29.   
  30.     <end-state name="end"></end-state>  
  31.   
  32.     <task-node name="HandlerAcceptance"  create-tasks="false">  
  33.         <task name="HandlerAcceptance"></task>  
  34.         <event type="node-enter">     
  35.             <action name="createInstance" class="com.ivo.engine.wf.action.DynamicTaskAction">     
  36.             </action>     
  37.         </event>    
  38.         <transition name="accept" to="LeaderConfirmation"></transition>  
  39.     </task-node>  
  40.        
  41.     <task-node name="LeaderConfirmation">  
  42.         <task swimlane="leader">        </task>  
  43.         <transition name="accept" to="HandlerClose"></transition>  
  44.         <transition name="reject" to="Drafting"></transition>  
  45.     </task-node>  
  46.        
  47.     <task-node name="Drafting">  
  48.         <task swimlane="userHandler"> </task>  
  49.         <transition name="accept" to="HandlerAcceptance"></transition>  
  50.         <transition name="delete" to="end"></transition>  
  51.     </task-node>  
  52.        
  53.     <task-node name="HandlerClose">  
  54.         <task swimlane="handler"> </task>  
  55.         <transition name="accept" to="UserAcceptance"></transition>  
  56.     </task-node>  
  57.        
  58.     <task-node name="UserAcceptance">  
  59.         <task swimlane="userHandler"> </task>  
  60.         <transition name="accept" to="UserDeptAcceptance"></transition>  
  61.         <transition name="reject" to="HandlerClose"></transition>  
  62.     </task-node>  
  63.        
  64.     <task-node name="UserDeptAcceptance" create-tasks="false">  
  65.         <task name="deptAcceptance"></task>  
  66.         <event type="node-enter">     
  67.             <action name="createInstance" class="com.ivo.engine.wf.action.UserManagerAction">     
  68.             </action>     
  69.         </event>    
  70.         <transition name="loop" to="UserDeptAcceptance"></transition>  
  71.         <transition name="accept" to="DomainLeaderClose"></transition>  
  72.         <transition name="reject" to="HandlerClose"></transition>  
  73.     </task-node>  
  74.        
  75.     <task-node name="DomainLeaderClose">  
  76.         <task swimlane="leader"> </task>  
  77.         <transition name="accept" to="end"></transition>  
  78.         <transition name="reject" to="HandlerClose"></transition>  
  79.     </task-node>  
  80.        
  81. </process-definition>  

这里应用到循环节点的是UserDeptAcceptance,需要签上级,直到处级主管。

通过UserManagerAction,来动态创建taskInstance,jbpm好像有一个特性,一个node的task第一次创建之后,如果重新回到这个node,这个taskInstance的actorId还是原来的那个,所以我就用动态创建taskInstance,这样可以在每次进入这个node的时候给这个赋予不同的actorId。

java 代码
  1. package com.ivo.engine.wf.action;   
  2.   
  3. import org.jbpm.graph.def.ActionHandler;   
  4. import org.jbpm.graph.exe.ExecutionContext;   
  5. import org.jbpm.graph.exe.Token;   
  6. import org.jbpm.graph.node.TaskNode;   
  7. import org.jbpm.taskmgmt.def.Task;   
  8. import org.jbpm.taskmgmt.exe.TaskMgmtInstance;   
  9.   
  10. import com.ivo.engine.dao.HRDao;   
  11. import com.ivo.engine.model.Employee;   
  12.      
  13. public class UserManagerAction implements ActionHandler {      
  14.      
  15.     private static final long serialVersionUID = 1L;      
  16.      
  17.     public void execute(ExecutionContext executionContext) throws Exception {      
  18.            
  19.         String actorId = "";   
  20.            
  21.         String currDeptLevel = null;   
  22.         String loopActorId = (String)executionContext.getVariable("LoopActorId");   
  23.         String startActorId = (String)executionContext.getVariable("StartActorId");   
  24.            
  25.         String emp = null;   
  26.         Employee manager = null;   
  27.            
  28.         if ( loopActorId == null ){   
  29.             emp = startActorId;   
  30.         } else {   
  31.             emp = loopActorId;   
  32.         }   
  33.            
  34.         manager = HRDao.getManager(emp);   
  35.         actorId = manager.getDeptManager_FK();   
  36.         currDeptLevel = manager.getDeptLevel();   
  37.            
  38.         // set variables   
  39.         executionContext.setVariable("LoopActorId", actorId.trim());   
  40.         executionContext.setVariable("CurrDeptLevel", currDeptLevel);   
  41.         executionContext.setVariable("LoopTag""loop");   
  42.            
  43.         // create task   
  44.            
  45.         Token token = executionContext.getToken();      
  46.         TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();      
  47.      
  48.         TaskNode taskNode = (TaskNode) executionContext.getNode();      
  49.         Task task = (Task)taskNode.getTasks().iterator().next();      
  50.      
  51.         tmi.createTaskInstance(task, token).setActorId(actorId.trim());      
  52.     }      
  53.      
  54. }   

通过两个variable,来控制这个loop是否继续。

在taskInstance end的时候判断两个variable。

下面是end的方法实现。

java 代码
  1. ContextInstance contextInstance = taskInstance.getTaskMgmtInstance().getProcessInstance().getContextInstance();   
  2.             String loopTag = (String)contextInstance.getVariable("LoopTag");   
  3.                
  4.             if (loopTag != null && loopTag.equals("loop")) {   
  5.                    
  6.                 Integer deptLevel = Integer.valueOf((String)contextInstance.getVariable("DeptLevel"));   
  7.                 if ( deptLevel == null )   
  8.                     throw new WorkflowException("in loop node , variable(DeptLevel)  is null, pls set at start node");   
  9.                    
  10.                 Integer currDeptLevel = Integer.valueOf((String)contextInstance.getVariable("CurrDeptLevel"));   
  11.                 if ( currDeptLevel == null)   
  12.                     throw new WorkflowException("in loop node , variable(CurrDeptLevel)  is null, pls set at swimlane");   
  13.                    
  14.                 if (currDeptLevel <=deptLevel) {   
  15.                     taskInstance.end("accept");   
  16.                     contextInstance.setVariable("LoopTag"null);   
  17.                 }   
  18.                 else taskInstance.end("loop");   
  19.             }else {   
  20.                 taskInstance.end("accept");   
  21.             }   
  22.             jbpmContext.save(taskInstance);  
对比DeptLevel和CurrDeptLevel两个变量,就可以判断是继续loop,还是从accept结束这个loop。
分享到:
评论
1 楼 dyw8021 2007-08-30  
请教一个问题。就是说我有一个审批流程,在每个task-node接点呢,我有三个transition,分别是指向通过、不通过、返回修改task-node。我看过很多例子,大部分的作法是要调用TaskInstance.end()方法人为去指向某个接点。我感觉这样子工作流没有充分发挥作用,有没有办法就是说我在task-node配置一个expression或是别的,通过我传的参数值让jbpm自动帮我判断走向呢。我知道变通的作法就是再加一个decision,但是每个审批步骤再加一个decision或是共用一个decision会弄得流程图非常难看、复杂。有没有更好的办法呢,请赐教?

相关推荐

    工作流jbpm应用的实例

    1. **流程设计**:使用jbpm提供的BPMN编辑器(如Eclipse插件或Web表单),绘制业务流程图,定义各个活动、任务和决策节点。 2. **部署流程**:将设计好的流程模型打包成jbpm可识别的格式,然后部署到jbpm服务器上。...

    JBPM采购申请系统——08_JBPM流程节点.7z

    JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM采购申请系统——08_JBPM流程节点.7z JBPM...

    jBPM4工作流应用开发指南.pdf

    jBPM4作为该系列的一个版本,提供了一套完整的流程管理和执行框架,允许开发者构建灵活的工作流应用,以实现业务流程自动化。本指南由胡奇编写,旨在为开发者提供一个全面的参考,帮助他们快速学习和掌握使用jBPM4...

    jbpm4jbpm5

    jbpm应用开发指面(胡奇).pdf可能是胡奇专家对jbpm应用开发的实践经验分享,可能包含了最佳实践、常见问题解决方案和案例研究。开发者可以从中学到如何在实际项目中有效地运用jbpm,以及如何解决开发过程中遇到的...

    谈谈JBPM几种节点的不同用法及适合的应用场景

    NULL 博文链接:https://zpchen.iteye.com/blog/264455

    jbpm简介\jbpm简介

    综上所述,jBPM是一个功能强大、易于使用的商业流程管理工作流引擎。它不仅具备丰富的特性和高度的灵活性,而且在实际应用中也表现出了出色的稳定性和性能。对于寻求提高业务流程管理效率、简化软件开发过程的企业来...

    jbpm详细介绍,有关jbpm的功能、流程图、以及特殊功能

    jbPM的其他特殊功能还包括强大的监控和管理工具,如流程实例的跟踪、审计和可视化,以及支持动态流程变更和集成能力。它还提供了丰富的API和事件模型,方便开发者实现定制化的流程行为。此外,jbPM可以与其他Java EE...

    jBPM工作流应用开发指南

    在jBPM中,你可以设计流程图,这些图通过BPMN2.0语言来描述,包含了各种元素如开始节点、结束节点、用户任务、服务任务、并行网关、序列流等。这种图形化的表示方式使得业务流程易于理解,并且能与非技术人员进行...

    jBPM4工作流应用开发指南.rar

    **jBPM4工作流应用开发指南** jBPM4是一款强大的开源工作流管理系统,它为业务流程管理和执行提供了一套完整的解决方案。本指南将深入探讨jBPM4的特性和使用方法,帮助开发者实现高效的工作流应用开发。 **1. jBPM...

    jbpm的一个实例

    同时它还能被部署在任何一款JAVA应用服务器上 JBPM的工程文件,大家可以到如下网站上去下载:http://www.jboss.com/products/jbpm 目前的最新版本是3.2.1,本文就以此版本为例。在这里请大家下载jbpm-starters-...

    jbpm开发指南--jbpm全面介绍

    通过查看JBPM的表,我们知道要实现流程监控功能就是把JBPM当中的JBPM_PROCESSDEFINITION(已发布的流程表),JBPM_PROCESSINSTANCE(流程实例表),JBPM_TASKINSTANCE(流程产生的任务实例表)这三张表串联起来就可以...

    JBPM工作流应用开发文档

    【JBPM工作流应用开发文档】深入解析 JBPM(java Business Process Management)是一个基于JavaEE的轻量级工作流管理系统,旨在支持企业级的流程定义、部署、执行和管理。作为JBoss的一个子项目,它与其他优秀开源...

    jbpm学习资料,jbpm教程

    jbpm不仅支持工作流的建模、执行,还提供了监控和管理功能,使得开发者可以方便地构建和部署复杂的业务流程。本资料主要围绕jbpm的核心组件——jPDL进行讲解,帮助学习者深入理解jbpm的工作原理和应用。 jPDL(jBPM...

    jbpm应用开发技巧

    jbpm实例

    JBPM5基于tomcat web的应用

    理解这个应用的关键在于熟悉JBPM5的核心功能以及如何在Tomcat环境下配置和部署。 首先,JBPM5提供了以下核心功能: 1. **工作流引擎**:JBPM5内置了一个强大的工作流引擎,能够执行各种复杂的业务流程,包括任务...

    jbpm3.2表说明

    JBPM_NODE JBPM_PROCESSDEFINITION FK_PROCDEF_STRTSTA STARTSTATE_ 此关系表示那个节点是开始节点 JBPM_TRANSITION JBPM_TRANSITION FK_TRANS_PROCDEF PROCESSDEFINITION_ 一个流程可能会有很多的 TRANSITION...

    jBPM3.2.rar_JBPM3.2_jbpm_jbpm 3.2_jbpm3_jbpm3.2教程

    jbPM 3.2是该系统的一个版本,它提供了丰富的功能,包括流程设计、执行、监控以及优化,为企业构建灵活且可扩展的业务流程解决方案。 ### 一、jbPM 3.2 环境配置 在开始jbPM 3.2的开发之前,你需要配置好相应的...

    jboss --JBPM介绍及应用

    ### jBoss --JBPM介绍及应用 #### 一、引言与概述 JBoss jBPM(Job Business Process Management)是JBoss提供的一个强大的工作流引擎,它支持业务流程管理和自动化,尤其适用于Java环境中开发WS(Web Services)...

Global site tag (gtag.js) - Google Analytics