一个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></variable></variable></controller></task></task-node>
xml 代码
 
  1. <task-node name="审核" signal="first" end-tasks="true">  
  2.         <task name="审核员工请假" swimlane="boss" template="apply_2.ftl">  
  3.     <controller>  
  4.           <variable name="reason" access="read" mapped-name="reason"/>  
  5.          <variable name="day" access="read,write" mapped-name="day"/>  
  6.          <variable name="applyman" access="read" mapped-name="applyman"/>  
  7.          <variable name="decision" access="read,write" mapped-name="decision"/>  
  8.        controller>   
  9.    task>  
  10.     <task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl">  
  11.     <controller>  
  12.           <variable name="reason" access="read" mapped-name="reason"/>  
  13.          <variable name="day" access="read" mapped-name="day"/>  
  14.          <variable name="applyman" access="read" mapped-name="applyman"/>  
  15.          <variable name="decision" access="read,write" mapped-name="decision"/>  
  16.        controller>  
  17.    task>  
  18.     
  19.      <transition name="结束" to="归档">transition>  
  20.      <transition name="撤销" to="请假结束">transition>  
  21.      <transition name="修改" to="修改">transition>  
  22.   task-node>  
<task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><task-node name="审核"><task template="apply_2.ftl" swimlane="boss" name="审核员工请假"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><task template="apply_3_new.ftl" swimlane="applyman" name="撤回请假单"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">

这个节点包含了我们刚才说的两个任务.我们知道当流传到这个节点的时候.这两个任务会同时创建并分配给各自的人员.有一个人完成任务后 节点向指定的节点转向.同时结束另一个任务.     signal="first" 有一个任务结束节点就流转.  end-tasks="true" 结束该节点的时候自动结束其他没有完成的任务.

       这是个小例子没什么特别.可能早有高人知晓.在这我只是感觉到jbpm对节点是流程的一个等待状态这个含义,对我们设计流程有重要的意义.欢迎大家指正批评

   完整的xml流程定义.如果你要部署这个流程.这里需要说明的是
</variable></variable></controller></task></variable></variable></controller></task></task-node></variable></controller></task><variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day"> com.jbpmexample.jbpm.Assignment类是我自己的授权类.你自己写一个代替就好了,</variable></variable></variable></variable></variable><variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day"> template="apply_1.ftl"  这样的属性是我自己加的 为了实现显示页面的定制.需要去掉.否则部署的时候会报错</variable></variable></variable></variable></variable><task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><task-node name="审核"><task template="apply_2.ftl" swimlane="boss" name="审核员工请假"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><task template="apply_3_new.ftl" swimlane="applyman" name="撤回请假单"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">
xml 代码
 
<?xml version="1.0" encoding="UTF-8"?>      <process-definition     xmlns="urn:jbpm.org:jpdl-3.1"  name="新请假流程">     <swimlane name="applyman" />          <swimlane name="boss">       <assignment class="com.jbpmexample.jbpm.Assignment">            <swimlaneName>boss</swimlaneName>         </assignment>     </swimlane>           <start-state name="请假开始">       <task name="填写请假单" swimlane="applyman" <variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">template="apply_1.ftl"</variable></variable></variable></variable></variable>>           <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>  
</variable></variable></controller></task></variable></variable></controller></task></task-node></variable></controller></task>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值