一个JBPM实现互斥撤回任务的例子
关键字: 一节点多任务实例
有一个需求是这个样子的:员工请假,填写好请假单后,提交申请.上级主管会有一个审核请假的任务,同时申请人有一个撤回的任务.这这两个任务互斥,也就是说两个任务有一个先执行.另一个任务取消.
曾经看过网上一篇文章使用分支节点创建两个任务节点.当一个任务节点执行后写一个action类负责结束另一个任务节点.达到互斥撤回的效果.本人试验过确实可以完成.
不过这不符合我们常规的流程定义方式(需要增加一对分支,联合节点).并且不符合jbpm关于节点描述.
jbpm认为一个节点代表流程中的一个等待状态.显然领导审核和员工撤销请假处于同一个等待状态,也应该处于一个节点中.使用一对分支,联合节点的方式虽然形式上处于一个等待状态.但这样的流程设计是不合适的.
可以这样设计这个互斥回撤节点
<
task
-
node name
=
"
审核
"
signal
=
"
first
"
end
-
tasks
=
"
true
"
>
<
task name
=
"
审核员工请假
"
swimlane
=
"
boss
"
template
=
"
apply_2.ftl
"
>
<
controller
>
<
variable name
=
"
reason
"
access
=
"
read
"
mapped
-
name
=
"
reason
"
/>
<
variable name
=
"
day
"
access
=
"
read,write
"
mapped
-
name
=
"
day
"
/>
<
variable name
=
"
applyman
"
access
=
"
read
"
mapped
-
name
=
"
applyman
"
/>
<
variable name
=
"
decision
"
access
=
"
read,write
"
mapped
-
name
=
"
decision
"
/>
</
controller
>
</
task
>
<
task name
=
"
撤回请假单
"
swimlane
=
"
applyman
"
template
=
"
apply_3_new.ftl
"
>
<
controller
>
<
variable name
=
"
reason
"
access
=
"
read
"
mapped
-
name
=
"
reason
"
/>
<
variable name
=
"
day
"
access
=
"
read
"
mapped
-
name
=
"
day
"
/>
<
variable name
=
"
applyman
"
access
=
"
read
"
mapped
-
name
=
"
applyman
"
/>
<
variable name
=
"
decision
"
access
=
"
read,write
"
mapped
-
name
=
"
decision
"
/>
</
controller
>
</
task
>
<
transition name
=
"
结束
"
to
=
"
归档
"
></
transition
>
<
transition name
=
"
撤销
"
to
=
"
请假结束
"
></
transition
>
<
transition name
=
"
修改
"
to
=
"
修改
"
></
transition
>
</
task
-
node
>
这个节点包含了我们刚才说的两个任务.我们知道当流传到这个节点的时候.这两个任务会同时创建并分配给各自的人员.有一个人完成任务后 节点向指定的节点转向.同时结束另一个任务.
signal="first" 有一个任务结束节点就流转.
end-tasks="true" 结束该节点的时候自动结束其他没有完成的任务.
这是个小例子没什么特别.可能早有高人知晓.在这我只是感觉到jbpm对节点是流程的一个等待状态这个含义,对我们设计流程有重要的意义.欢迎大家指正批评
完整的xml流程定义.如果你要部署这个流程.这里需要说明的是
com.jbpmexample.jbpm.Assignment类是我自己的授权类.你自己写一个代替就好了,
template="apply_1.ftl" 这样的属性是我自己加的 为了实现显示页面的定制.需要去掉.否则部署的时候会报错
<?
xml version
=
"
1.0
"
encoding
=
"
UTF-8
"
?>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<
process
-
definition
xmlns
=
"
urn:jbpm.org:jpdl-3.1
"
name
=
"
新请假流程
"
>
<
swimlane name
=
"
applyman
"
/>
<
swimlane name
=
"
boss
"
>
<
assignment
class
=
"
workflow.test.Assignment
"
>
<
swimlaneName
>
boss
</
swimlaneName
>
</
assignment
>
</
swimlane
>
<
start
-
state name
=
"
请假开始
"
>
<
task name
=
"
填写请假单
"
swimlane
=
"
applyman
"
template
=
"
apply_1.ftl
"
>
<
controller
>
<
variable name
=
"
reason
"
access
=
"
read,write
"
mapped
-
name
=
"
reason
"
/>
<
variable name
=
"
day
"
access
=
"
read,write
"
mapped
-
name
=
"
day
"
/>
<
variable name
=
"
applyman
"
access
=
"
read,write
"
mapped
-
name
=
"
applyman
"
/>
</
controller
>
</
task
>
<
transition name
=
"
结束
"
to
=
"
审核
"
></
transition
>
</
start
-
state
>
<
task
-
node name
=
"
审核
"
signal
=
"
first
"
end
-
tasks
=
"
true
"
>
<
task name
=
"
审核员工请假
"
swimlane
=
"
boss
"
template
=
"
apply_2.ftl
"
>
<
controller
>
<
variable name
=
"
reason
"
access
=
"
read
"
mapped
-
name
=
"
reason
"
/>
<
variable name
=
"
day
"
access
=
"
read,write
"
mapped
-
name
=
"
day
"
/>
<
variable name
=
"
applyman
"
access
=
"
read
"
mapped
-
name
=
"
applyman
"
/>
<
variable name
=
"
decision
"
access
=
"
read,write
"
mapped
-
name
=
"
decision
"
/>
</
controller
>
</
task
>
<
task name
=
"
撤回请假单
"
swimlane
=
"
applyman
"
template
=
"
apply_3_new.ftl
"
>
<
controller
>
<
variable name
=
"
reason
"
access
=
"
read
"
mapped
-
name
=
"
reason
"
/>
<
variable name
=
"
day
"
access
=
"
read
"
mapped
-
name
=
"
day
"
/>
<
variable name
=
"
applyman
"
access
=
"
read
"
mapped
-
name
=
"
applyman
"
/>
<
variable name
=
"
decision
"
access
=
"
read,write
"
mapped
-
name
=
"
decision
"
/>
</
controller
>
</
task
>
<
transition name
=
"
结束
"
to
=
"
归档
"
></
transition
>
<
transition name
=
"
撤销
"
to
=
"
请假结束
"
></
transition
>
<
transition name
=
"
修改
"
to
=
"
修改
"
></
transition
>
</
task
-
node
>
<
task
-
node name
=
"
归档
"
>
<
task name
=
"
请假归档
"
swimlane
=
"
applyman
"
template
=
"
apply_4.ftl
"
>
<
controller
>
<
variable name
=
"
reason
"
access
=
"
read
"
mapped
-
name
=
"
reason
"
/>
<
variable name
=
"
day
"
access
=
"
read
"
mapped
-
name
=
"
day
"
/>
<
variable name
=
"
applyman
"
access
=
"
read
"
mapped
-
name
=
"
applyman
"
/>
<
variable name
=
"
decision
"
access
=
"
read
"
mapped
-
name
=
"
decision
"
/>
</
controller
>
</
task
>
<
transition name
=
"
结束
"
to
=
"
请假结束
"
></
transition
>
</
task
-
node
>
<
end
-
state name
=
"
请假结束
"
></
end
-
state
>
<
task
-
node name
=
"
修改
"
>
<
task name
=
"
修改
"
swimlane
=
"
applyman
"
template
=
"
apply_1.ftl
"
>
<
controller
>
<
variable name
=
"
reason
"
access
=
"
read,write
"
mapped
-
name
=
"
reason
"
/>
<
variable name
=
"
day
"
access
=
"
read,write
"
mapped
-
name
=
"
day
"
/>
<
variable name
=
"
applyman
"
access
=
"
read
"
mapped
-
name
=
"
applyman
"
/>
</
controller
>
</
task
>
<
transition name
=
"
结束
"
to
=
"
审核
"
></
transition
>
</
task
-
node
>
</
process
-
definition
>
在javaeye与其他jbpm使用者的讨论
http://jbpm.group.javaeye.com/group/blog/59741