jbpm学习四

来源:互联网 发布:域名分发系统 编辑:程序博客网 时间:2024/05/04 04:31

一.JPDL的学习

JPDL(JBoss JBPM Process Definition Language)是构建于JBPM框架上的流程语言,在实际开发jbpm流程中,就是基于JPDL语言进行描述的。

1.process元素(根节点):

任何一个流程,都必须包括开始节点和结束节点

Process有三个核心属性:


name代表流程名称,用于在系统中显示给用户(我们都是中国人,一般都爱看中文的吧,所以最好存中文)。

key代表流程关键字,用于进行jbpm代码操作(一般是英文),如果在xml描述文件不配置的话,默认就和name的值一样。

version代表流程版本号,key和name相同的流程,版本+1。

<process name="测试流程" key="myprocess" version="1"  xmlns="http://jbpm.org/4.4/jpdl">

注:process节点信息存入jbpm4_deployprop表中,pdid是由pdkey + '-' + pdversion组成的(唯一性)。

2.transition节点(连线,流转,转移)

transition代表一个节点流向另一个节点,有以下几点需要说明一下:

(1)一个活动中可以指定一个或者多个transition

(2)开始活动只能有一个transition

(3)结束活动没有transition

(4)其他活动可以有一个或者多个transition

举个例子:


   <task name="task1" g="231,97,92,52">      <transition name="abc" to="task2" g="-53,-17"/>      <transition to="task3" g="-53,-17"/>   </task>
上面的xml配置文件是该流程图task1节点部分的配置文件

ExecutionService提供了两种流转方法

(1)signalExecutionById(java.lang.String executionId)

(2)signalExecutionById(java.lang.String executionId, java.lang.String signalName)

第一个方法没有指定signalName,所以使用默认transition,比如上面的xml配置文件,task1下面的task3节点就没有那么,这个就是该transition默认的流向,但是一个活动只允许有

一个不配置名字的transition(这个不用多解释吧,默认值只能有一个)。

通过代码直接结束流程:

processEngine.getExecutionService().endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);

3.state节点(等待节点):

state节点是等待条件,环境的变化,由程序自动触发state节点向后流转,

那么问题来了,state节点和task节点有什么区别:

(1)state节点是周围环境发生变化,自动触发流程流转,无需人工进行干预。

(2)task节点需要特定的人进行办理,才能完成。

举个例子:

<?xml version="1.0" encoding="UTF-8"?><process name="demo3_state" xmlns="http://jbpm.org/4.4/jpdl">   <start name="start1" g="247,21,48,48">      <transition name="to 付款" to="付款" g="-47,-17"/>   </start>   <end name="end1" g="249,288,48,48"/>   <task name="付款" g="225,105,92,52">      <transition name="to 付款完成" to="付款完成" g="-71,-17"/>   </task>   <state name="付款完成" g="228,190,92,52">      <transition name="to end1" to="end1" g="-47,-17"/>   </state></process>
jpdl配置文件如上所示,流程发布,启动我就不再多说,下面直接看state和task的区别:

<span style="white-space:pre"></span>@Test// 完成付款任务public void demo3() {<span style="white-space:pre"></span>// 1、 获得流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceTaskService taskService = processEngine.getTaskService();// 3、完成任务taskService.completeTask("10002"); //jbpm4_task的DBID}@Test// 付款完成,回调程序public void demo4() {// 1、 获得流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceExecutionService executionService = processEngine.getExecutionService();// 3、向后流转executionService.signalExecutionById("demo3_state.10001"); //jbpm4_execution表ID}
先执行demo3,jbpm4_task中就没有流程demo3_state的记录了,只能在jbpm4_execution中查到记录,因为当前节点是state,并不是task,所以task节点就为空。

再接着执行demo4,jbpm4_execution表中关于流程demo3_state的记录也为空(说明state节点也之行结束了)。











0 0