`
hbxflihua
  • 浏览: 678375 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jbpm4.4 使用之活动标签

    博客分类:
  • jbpm
 
阅读更多

活动标签

-控制流程的活动

-原子活动

 

控制流程的活动

Start   开始节点,一个(主)流程只能有一个开始节点

End     结束节点,一个流程可以有多个结束节点

Decision 条件判断节点,当一个流程出现多个分支(情况),而分支排他时使用。

Fork    分支节点,当一个流程出现多个分支,而分支并列执行时使用。

Join    聚合/联合节点,通常与fork节点一起使用。

Sub-process 子流程(本人未曾使用过)

State   状态节点    一个暂停节点,当需要对流程的执行进行控制时使用。

Task    任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务

 

原子活动

JavaScriptSqlHqlEmail

 

 

下面介绍三个最常用的活动

state

一个强制流程暂停的节点,当需要对流程的执行进行控制时使用。该节点可能什么都不需要做,也可能执行一些的操作。比如,路过银行,你拍怕裤兜,看看钱够还是不够。如果钱还可以花一段时间,你就不会去取钱。如果钱不多了,你就会去银行取些现金。或是钱本来就够花,但外面在下着雨,你想取避一避雨也不是不可以。State要做的相当于带你路过银行,至于你取不取钱,取多少,还是为了别的什么,不是它说了算,而是你自己的决定。

 

第一种方式:无分支的State

<?xml version="1.0" encoding="UTF-8"?>

<process name="simpleState" xmlns="http://jbpm.org/4.3/jpdl">
   <start name="start1" g="368,117,48,48">
      <transition name="to state" to="state" g="-59,-17"/>
   </start>
   <end name="end" g="372,396,48,48"/>
   <state name="state" g="348,250,92,52">
      <transition name="to end" to="end" g="-47,-17"/>
   </state>
</process>

 

测试代码如下:

ProcessInstance processInstance = 
			executionService.startProcessInstanceByKey("simpleState");
		System.out.println("流程实例Id:"+
				processInstance.getId());
        System.out.println("流程定义Id:"+
        		processInstance.getProcessDefinitionId());	        
		System.out.println("是否在 state节点:"+
				processInstance.isActive("state"));//true
		System.out.println("判断流程是否结束:"+
				processInstance.isEnded());//false
		
		processInstance = 
			executionService.signalExecutionById(processInstance.getId());
		System.out.println("是否在 state节点:"+
				processInstance.isActive("state"));//true
		System.out.println("判断流程是否结束:"+
				processInstance.isEnded());//false

 

执行结果如下:

流程实例Id:simpleState.7
流程定义Id:simpleState-1
是否在 state节点:true
判断流程是否结束:false
**************
是否在 state节点:false
判断流程是否结束:true

 

第二种方式:有分支的state

<?xml version="1.0" encoding="UTF-8"?>

<process name="compState" xmlns="http://jbpm.org/4.3/jpdl">
   <start name="start1" g="300,106,48,48">
      <transition name="to proot" to="proot" g="-59,-17"/>
   </start>
   <end name="end" g="315,448,48,48"/>
   <state name="proot" g="281,223,92,52">
      <transition name="to boy" to="boy" g="-59,-17"/>
      <transition name="to girl" to="girl" g="-59,-17"/>
   </state>
   <state name="boy" g="187,346,92,52">
      <transition name="to end" to="end" g="-47,-17"/>
   </state>
   <state name="girl" g="383,342,92,52">
      <transition name="to end" to="end" g="-47,-17"/>
   </state>
</process>

 

测试代码如下:

ProcessInstance processInstance = 
			executionService.startProcessInstanceByKey("compState");
        
		System.out.println("是否在 proot节点:"+
				processInstance.isActive("proot"));//true
		System.out.println("是否在 boy节点:"+
				processInstance.isActive("boy"));//false
		
		System.out.println("是否在 girl节点:"+
				processInstance.isActive("girl"));//false
		
		System.out.println("判断流程是否结束:"+
				processInstance.isEnded());//false
		
		processInstance = 
			executionService.signalExecutionById(processInstance.getId(),"to boy");//因为proot往下有多个分支,如果不指定流程转向,流程不会继续往下执行
		System.out.println("是否在 proot节点:"+
				processInstance.isActive("proot"));//false
		System.out.println("是否在 boy节点:"+
				processInstance.isActive("boy"));//true
		System.out.println("是否在 girl节点:"+
				processInstance.isActive("girl"));//false
		System.out.println("判断流程是否结束:"+
				processInstance.isEnded());//false	

 

executionService.signalExecutionById(processInstance.getId(),"to boy");

这句如果改为:

executionService.signalExecutionById(processInstance.getId());

则流程不会往下执行,流程继续停留在proot节点。

 

decision  

条件判断节点,当一个流程出现多个中情况而各种情况都排他时使用,相当于switch case.

第一种方式:decision内置condition

 

<?xml version="1.0" encoding="UTF-8"?>
<process key="deci" name="deci" xmlns="http://jbpm.org/4.3/jpdl">
   <start g="358,77,48,48" name="start1">
      <transition g="-83,-17" name="to exclusive1" to="exclusive1"/>
   </start>
   <end g="374,510,48,48" name="end"/>
   <decision g="358,219,48,48" name="exclusive1">
      <transition g="-59,-17" name="to 200" to="200">
      	<condition expr="#{errorcode == 200}"/>
      </transition>
      <transition g="-59,-17" name="to 404" to="404">
      	<condition expr="#{errorcode == 404}"/>
      </transition>
      <transition g="-59,-17" name="to 500" to="500">      
      	<condition expr="#{errorcode == 500}"/>
      </transition>
   </decision>
   <state g="194,351,92,52" name="200">
      <transition g="-47,-17" name="to end" to="end"/>
   </state>
   <state g="340,349,92,52" name="404">
      <transition g="-47,-17" name="to end" to="end"/>
   </state>
   <state g="476,349,92,52" name="500">
      <transition g="-47,-17" name="to end" to="end"/>
   </state>
</process>

 

 

测试代码如下:

Map<String, String> variables = new HashMap<String, String>();
		variables.put("errorcode", "200");
		ProcessInstance processInstance = 
			executionService.startProcessInstanceByKey("deci", variables);
		
		System.out.println("200 isActive:"+
				processInstance.isActive("200"));//进入state 200,暂停
		System.out.println("processInstance isEnd:"+
				processInstance.isEnded());	//流程未结束,返回false
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		
		//该方法返回processInstance如果不接收,processInstance还是原来的对象
		//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
		processInstance=
			executionService.signalExecutionById(processInstance.getId());
		
		System.out.println("processInstance isEnd:"+
				processInstance.isEnded());	//流程结束,返回true
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

 

控制台输出结果如下:

200 isActive:true
processInstance isEnd:false
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
********
processInstance isEnd:true
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

第二种方式:为decision活动设置expr

<?xml version="1.0" encoding="UTF-8"?>
<process name="deciBaseExpr" xmlns="http://jbpm.org/4.3/jpdl">
   <start name="start1" g="407,65,48,48">
      <transition name="to exclusive1" to="exclusive1" g="-83,-17"/>
   </start>
   <end name="end1" g="418,497,48,48"/>
   <decision name="exclusive1" g="409,207,48,48" expr="#{whatcode}">
      <transition name="to 200" to="200" g="-59,-17"/>
      <transition name="to 404" to="404" g="-59,-17"/>
      <transition name="to 500" to="500" g="-59,-17"/>
   </decision>
   <state name="200" g="251,344,92,52">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
   <state name="404" g="389,342,92,52">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
   <state name="500" g="516,341,92,52">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
</process>

 

测试代码如下:

Map<String, String> variables = new HashMap<String, String>();
		variables.put("whatcode", "to 404");
		ProcessInstance processInstance = 
			executionService.startProcessInstanceByKey("deciBaseExpr", variables);
		
		System.out.println("200 isActive:"+
				processInstance.isActive("200"));//返回false
		System.out.println("404 isActive:"+
				processInstance.isActive("404"));//返回true
		System.out.println("500 isActive:"+
				processInstance.isActive("500"));//返回false
		System.out.println("processInstance isEnd:"+
				processInstance.isEnded());	//流程未结束,返回false
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		
		//该方法返回processInstance如果不接收,processInstance还是原来的对象
		//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
		processInstance=
			executionService.signalExecutionById(processInstance.getId());
		
		System.out.println("processInstance isEnd:"+
				processInstance.isEnded());	//流程结束,返回true
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

 

控制台输出结果如下:

200 isActive:false
404 isActive:true
500 isActive:false
processInstance isEnd:false
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
***************
processInstance isEnd:true
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

第三种方式:为decision配置handler

<?xml version="1.0" encoding="UTF-8"?>
<process name="deciByHandler" key="deciByHandler" xmlns="http://jbpm.org/4.3/jpdl">
   <start name="start1" g="341,55,48,48">
      <transition name="to exclusive1" to="exclusive1" g="-83,-17"/>
   </start>
   <end name="end1" g="346,435,48,48"/>
   <decision name="exclusive1" g="340,164,48,48">
  	  <handler class="com.lihua.HandlerDecision"></handler>
      <transition name="to 200" to="200" g="-59,-17"/>
      <transition name="to 404" to="404" g="-59,-17"/>
      <transition name="to 500" to="500" g="-59,-17"/>
   </decision>
   <state name="200" g="178,315,92,52">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
   <state name="404" g="322,309,92,52">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
   <state name="500" g="461,309,92,52">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </state>
</process>

 

Handler类:

 

package com.lihua;

import org.jbpm.api.jpdl.DecisionHandler;
import org.jbpm.api.model.OpenExecution;

public class HandlerDecision implements DecisionHandler {

	private static final long serialVersionUID = -1639139174140348966L;

	@Override
	public String decide(OpenExecution execution) {
        return (String) execution.getVariable("towhere");    
	}

}

 

测试代码如下:

Map<String, String> variables = 
			new HashMap<String, String>();
		variables.put("towhere", "to 500");
		ProcessInstance processInstance = 
			executionService.
			startProcessInstanceByKey("deciByHandler", variables);
		
		System.out.println("200 isActive:"+
				processInstance.isActive("200"));//返回 false
		System.out.println("404 isActive:"+
				processInstance.isActive("404"));//返回 false
		System.out.println("500 isActive:"+
				processInstance.isActive("500"));//返回 true
		System.out.println("processInstance isEnd:"+
				processInstance.isEnded());	//流程未结束,返回false
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		
		//该方法返回processInstance如果不接收,processInstance还是原来的对象
		//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
		processInstance=
			executionService.signalExecutionById(processInstance.getId());
		
		System.out.println("processInstance isEnd:"+
				processInstance.isEnded());	//流程结束,返回true
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

 

控制台输出结果如下:

200 isActive:false
404 isActive:false
500 isActive:true
processInstance isEnd:false
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
************
processInstance isEnd:true
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

以上三种方式差别都不是很大,第三中在程序中通过Handler进行复杂的处理。个人觉得,如果对于逻辑不是很复杂的操作,前两种方式是比较可取的。但如果逻辑过于复杂,或者还有其他的操作比如同步数据库中的其他信息等操作时,不妨选择第三种方式。

这些代码代码比较简单,这里就不做过多的解释。

 

Task

任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务.

Taskassignee属性

 

第一, assignee用来指示用户,负责完成任务的人。分配人是一个任务中的字符串属性,引用一个用户。(直接指定一个字符串)

第二,这个属性默认会当做表达式来执行。(指定一个表达式,然后在代码里为该表达式赋值) :在这里任务被分配给#{order.owner}。这意味着首先使用order这个名字查找一个对象。 其中一个查找对象的地方是这个任务对应的流程变量。 然后getOwner()方法会用来获得用户id, 引用的用户负责完成这个任务。

 

<?xml version="1.0" encoding="UTF-8"?>

<process name="task" xmlns="http://jbpm.org/4.3/jpdl">
   <start name="start1" g="390,97,48,48">
      <transition name="to task" to="task" g="-53,-17"/>
   </start>
   <end name="end1" g="391,362,48,48"/>
   <task name="task" g="368,239,92,52" assignee="${taskAssignee}">
      <transition name="to end1" to="end1" g="-47,-17"/>
   </task>
</process>

 

 

测试代码如下:

Map<String,String> map=
			new HashMap<String, String>();
        map.put("taskAssignee", "lihua");
        ProcessInstance processInstance=null;
        for (int i = 0; i < 2; i++) {
        	processInstance=executionService.
        	startProcessInstanceByKey("task",map);			
        	System.out.println("流程是否处于task节点:"+
        			processInstance.isActive("task"));//true
        	System.out.println("流程实例Id:"+
        			processInstance.getId());
		}
        List<Task> list=taskService.findPersonalTasks("lihua");
        for (Task task : list) {
            System.out.println("任务活动名称:"+
            		task.getActivityName());
            System.out.println("流程实例Id:"+
            		task.getExecutionId());
            System.out.println("任务活动Id:"+
            		task.getId());
            System.out.println("任务活动创建时间:"+
            		task.getCreateTime());
            System.out.println("任务活动进度:"+
            		task.getProgress());
            System.out.println("任务活动分配给:"+
            		task.getAssignee());
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        }

 

控制台输出结果如下:

流程是否处于task节点:true
流程实例Id:task.7
************
流程是否处于task节点:true
流程实例Id:task.11
*****************
任务活动名称:task
流程实例Id:task.11
任务活动Id:13
任务活动创建时间:2012-02-16 15:48:50.406
任务活动进度:null
任务活动分配给:lihua
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
任务活动名称:task
流程实例Id:task.7
任务活动Id:9
任务活动创建时间:2012-02-16 15:48:50.375
任务活动进度:null
任务活动分配给:lihua
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

 

 

1、在流程设置时如果出现乱码可在Eclipse.ini中添加如下配置:
-Dfile.encoding=UTF-8
2、在jbpm中表达式$(),#()均可以成功解析。

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 dmthlbfjm 2012-03-13  
楼主能发一个审批例子的源码学习一下么?最近在学习jbpm4.4,创建流程实例时,不知道怎么实现流程的审批.谢谢!  759415964@qq.com

相关推荐

    jbpm4.4spring.rar_jbpm4_jbpm4.4

    【标签】"jbpm4 jbpm4.4" 强调了项目使用的具体版本,这可能对开发者了解项目的兼容性和解决可能遇到的问题有所帮助,因为不同版本的JBPM可能会有不同的特性和API变化。 【压缩包子文件的文件名称列表】: 1. `....

    JBPM4.4完整可用审批流程

    使用JBPM4.4,开发者可以设计复杂的审批流程,例如请假申请、报销审批等,通过图形化的流程设计器(Business Process Designer)创建流程模型。流程中的每个步骤可以关联到一个任务,任务可以分配给不同的角色或用户...

    jbpm4.4开发包2

    【标签】"jbpm4.4 lib2"强调了这个压缩包是jbpm4.4版本的一部分,且主要是库文件的第二个部分。"lib"通常指的是库目录,包含了一系列的jar文件,这些文件包含了jbpm4.4运行所必需的类库和API,例如:核心引擎、工作...

    jbpm4.4中文手册

    从给定的文件标题“jbpm4.4中文手册”及其描述、标签和部分内容中,我们可以提炼出关于jBPM4.4的关键知识点。jBPM(Java Business Process Management)是一个开源的工作流引擎,用于执行业务流程管理。下面将详细...

    Jbpm4.4 整合Spring Hibernate4

    "Jbpm4.4 整合Spring Hibernate4" 指的是一个集成项目,其中JBPM(Job Business Process Management)版本4.4被整合到Spring框架和Hibernate ORM工具的环境中。JBPM是一个开源的工作流管理系统,用于处理业务流程的...

    jbpm4.4 练习代码

    最后,作为“工具”标签的一部分,jbpm4.4练习代码也可能涉及到与其他开发工具(如IDEA、Maven、Git等)的集成,以及如何配置开发环境以支持jbpm项目。文件名称"JavaCode"表明代码主要是用Java语言编写的,因此...

    jBPM4.4 SQLSERVER 精简 包

    【标签】中的"jBPM4.4 SQLSERVER 精简 包"进一步强调了这个压缩包的特性,即针对SQL Server的精简版,这意味着可能只包含了与SQL Server兼容的部分功能和驱动,以适应特定环境的需求。 【lib】文件夹通常包含库文件...

    JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)

    标题中的“JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)”是指在使用JBPM(Java Business Process Management)4.4版本时,设计了一个特殊的流程控制机制,允许用户在执行流程过程中进行回...

    myeclipse的jBPM4.4整合ssh2.rar

    【标题】"myeclipse的jBPM4.4整合ssh2.rar" 涉及的是在MyEclipse集成开发环境中整合Java业务流程管理(jBPM)4.4版本与Spring、Struts2(SSH2)框架的技术实践。这个压缩包文件提供了整合过程的相关资源,包括配置...

    Myeclipse8.6集成jBPM4.4插件

    【标题】"Myeclipse8.6集成jBPM4.4插件" 【内容详解】 MyEclipse是一款强大的Java集成开发环境,尤其在企业级应用开发中广受欢迎。而jBPM(Java Business Process Management)则是一个开源的工作流管理系统,它...

    jbpm 4.4 学习笔记

    在数据库层面,jbpm 4.4 使用了多个表来存储流程相关信息,包括流程定义、实例、历史记录、参与者、泳道等。这些表可以分为以下几类: 1. 系统相关:如JBPM4_PROPERTY。 2. 流程定义相关:如JBPM4_DEPLOYMENT、JBPM4...

    SSH整合JBPM4.4说明文档

    SSH整合JBPM4.4是将Spring、Struts和Hibernate这三大开源框架与Business Process Management System (BPMS)工具jbPM进行集成的过程。jbPM是一个开源的工作流管理系统,用于管理和执行业务流程。在这个过程中,SSH...

    JBPM4.4+SSH2完整整合jar包

    【JBPM4.4+SSH2完整整合jar包】是一个包含了一系列Java库的压缩包,主要用于帮助开发者在Java环境中实现业务流程管理(BPM)与Spring(SSH中的S)、Struts(SSH中的H)和Hibernate(SSH中的H)的深度集成。...

    JBPM4.4 lib

    【标签】"源码"表明这个压缩包可能包含部分JBPM4.4的源代码,这对于开发者来说是宝贵的资源,他们可以通过阅读源码来理解系统内部的工作机制,定制功能,或者调试问题。"工具"标签则暗示这个lib文件夹可能是用于辅助...

    jBPM4实战系列(二)jBPM4.4+ssh 整合配置及完整实例

    "jBPM4实战系列(二)jBPM4.4+ssh 整合配置及完整实例" 这个标题表明我们将会探讨一个关于jBPM4的具体实战项目,特别关注的是如何将jBPM4版本与SSH(Spring、Struts和Hibernate)框架整合,并提供了一个完整的实现示例...

    jbpm-gpd-site 4.4.zip

    jbpm-gpd-site 4.4.zip 是一个与jbpm(Java Business Process Management)相关的压缩文件,它包含的是jbpm-eclipse插件的特定版本,适用于jbpm 4.4框架。jbpm是一个开源的工作流管理系统,用于设计、执行和管理业务...

    JBPM4运行时错误异常总结

    6. `org.jbpm.api.JbpmException: error: no start activity in process`: 这个异常表示在流程定义中找不到开始活动。这可能是由于jpdl文件的XML语法错误,例如在标签中错误地声明了命名空间。解决方法是检查并修正...

    jbpm 请假示例 简易 修改版

    在【jbpm 简单 例子】的标签中,我们可以推断出这个示例是为初学者设计的,目的是让他们快速掌握jbpm的基本用法。这可能包括如何创建流程模型,如何编写Java代码来启动和控制流程,以及如何通过jbpm提供的API进行...

    202006081515.zip

    配置Eclipse以使用JBPM4.4插件可能包括以下步骤: 1. 创建新的JBPM项目,选择适当的模板(如BPMN2流程定义)。 2. 设置项目的JBOSS或Tomcat服务器环境,以便部署和运行流程应用。 3. 使用插件提供的图形化流程设计器...

Global site tag (gtag.js) - Google Analytics