流程定义时,分配任务有多种方法:
1. 直接分配给成员:assignee="user1" 可以同时分配多人:candidate-users("user1","user2","user3")
2. 分配给组:candidate-groups="it_dept" 分配给多个组:用逗号隔开部门id组列表。
3. 利用任务泳道进行分配:
1.任务泳道分配的特点:一个单子可以有多个人填写,一旦A填写了,别人就不能填写。而且当A提交的单子被退回的时候还应该有A来继续。
2.泳道定义:<swimlane candidate-groups="it_dept" name="test"/>,也可以为 candidate-users.
3.使用泳道:在task定义时 swimlane="test" 使用泳道,任务分配给it_dept部 门
4.使用任务分配器assignment-handler标签 使用方法:<assignment-handler class = "">
<field name="test"><string value="ttttttt"/></field>
</assignment-handler>
在class里面动态分配assignable.setAssignee(test);
通过传参数,设置 test的值。实现动态分配
List<Task> taskList = taskService.findPersonalTasks(username);
List<Task> taskList = taskService.findGroupTasks(username);
由于任务有转交,加签等功能,所以一个人想要得到自己的任务就包括 组成员任务和成员任务两部分组成。
得到任务列表后,如果任务有对应的表单,就先跳到表单,填写,然后执行。表单的绑定:在task标签中使用 form = "xxxx.jsp",执行语句:
taskService.completeTask(taskId,"toFork1",map);
taskId 是任务id
toFork1 是outcome,即任务的出口
Map 是 传递的任务参数,通过任务就可以得到这些参数:
得到指定的参数值:taskService.getVariable(taskId, "user")
得到所有的参数:taskService.getvariableNames(java.lang.String.taskId);
taskService.assignTask(taskId,"用户Id");
taskService.addTaskParticipatingUser(taskId,"用户Id",Participation.CANDIDATE);
<fork g="276,239,48,48" name="fork1">
<transition g="-54,-18" name="to 计划部" to="计划部"/>
<transition g="-54,-18" name="to 法务部" to="法务部"/>
<transition g="-64,-18" name="to IT规划部" to="IT规划部"/>
</fork>
Fork join 处理并发的情况,分配给的三个部门当执行完后,都流入到join标签。
Join标签属性: multiplicity="3" multiplicity 的意思是当有几个执行到了join时,流程继续。
decision中会运行并判断每一个transition 里的判断条件。 当遇到一个嵌套条件是true 或者没有
设置判断条件的转移,那么转移就会被运行。
例子:当天数大于3天,总经理审批 否则 结束
<decision expr="#{day > 3 ? 'to 总经理' : 'to 结束}" g="361,280,48,48" name="exclusive1">
<transition g="-42,-18" name="to end1" to="end1"/>
<transition g="-44,-18" name="to task2" to="总经理审核"/>
</decision>
Decision属性: expr 表达式 必填
当一个流程通过这一点时,事件监听器就会被提醒。
用法:在流程的任何地方都可以加入监听
<on event="start">
<event-listener class="org.jbpm.examples.eventlistener.LogListener">
// 参数
<field name="msg"><string value="start on process definition"/></field>
</event-listener>
开始节点 流程开始,每个流程定义文件 只能有一个开始节点。
任务节点 人工参与,调用processEngine.getTaskService().complete()完 成任务
状态节点
需要使用execution.signalExcution()触发流程流转
流程流向判断节点
指定condition条件或者DesisionHandler
分支节点,任务并行处理
任务聚合节点
任务结束节点 可以有多个结束节点
控制任务流向
事件触发 可以在任何节点加事件触发处理
具体参看${JPBM.HOME}/doc/userguide文档 关于JPDL的描述
(1)JBPM4_DEPLOYMENT、
(2)JBPM4_DEPLOYPROP
(3)JBPM4_LOB:
存储 上传一个包含png和jpdl.xml的zip包 的相关数据
jbpm4_deployment表多了一条记录
jbpm4_deployprop表多了四条记录,对应langid,pdid,pdkey,pdversion
jbpm4_lob 表多了二条记录,保存流程图png图片和jpdl.xml
(4)JBPM4_HIST_PROCINST与(5)JBPM4_HIST_ACTINST
分别存放的是Process Instance、Activity Instance的历史记录。
(6)JBPM4_EXECUTION
主要是存放JBPM4的执行信息,Execution机制代替了JBPM3的Token机制
(7)JBPM4_TASK
存放需要人来完成的Activities,需要人来参与完成的Activity被称为Task。
(8)JBPM4_PARTICIPATION
存放Participation的信息,Participation的种类有Candidate、 Client、Owner、Replaced Assignee和Viewer。而具体的Participation既可以是单一用户,也可以是用户组。
(9)JBPM4_SWIMLANE
Swim Lane是一种Runtime Process Role。通过Swim Lane,多个Task可以一次分配到同一Actor身上。
(10)JBPM4_VARIABLE
存的是进行时的临时变量。
(11)JBPM4_HIST_DETAIL
保存Variable的变更记录。
(12)JBPM4_HIST_VAR
保存历史的变量。
(13)JBPM4_HIST_TASK
Task的历史信息。
(14)JBPM4_ID_GROUP(15)JBPM_ID_MEMBERSHIP(16)JBPM4_ID_USER
这三张表很常见了,基本的权限控制,关于用户认证方面建议还是自己开发一套,JBPM4的功能太简单了,使用中有很多需要难以满足。
(17)JBPM4_JOB
存放的是Timer的定义。
(18)JBPM4_PROPERTY