一.简介
上一篇文章介绍了学习UserTask 设置用户的两种方式,这篇下UserTask 设置用户的其他方式。
流程图还是之前那个:
二.第三种:通过监听器设置
我可以通过监听器来设置任务的处理人。具体方式如下:
首先我们在绘制流程图的时候,不需要给 UserTask 分配用户,截图如下:
然后为这个 UserTask 设置一个任务监听器,截图如下:
首先点击 + 号,然后选择 CREATE 事件,最后再给出事件对应的实体类,截图如下:
这个实体类是我们项目中真实存在的一个类,代码如下:
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("javaboy");
}
}
当这个 UserTask 创建的时候,就会触发这个监听器,为该 UserTask 设置处理人。
来看下这个流程图对应的 XML 文件内容是什么:
<process id="demo01" name="demo01" isExecutable="true">
<documentation>demo01</documentation>
<startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
<userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:formFieldValidation="true">
<extensionElements>
<flowable:taskListener event="create" class="org.javaboy.flowableidm.MyTaskListener"></flowable:taskListener>
</extensionElements>
</userTask>
<sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
<endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
<sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>
event=“create” class=“org.javaboy.flowableidm.MyTaskListener” 就是我们设置的内容了。
现在我们部署并启动这个流程,当我们流程启动后,就可以在 ACT_RU_TASK 表中看到一条 javaboy 待处理的任务了。
三.其他情况
最后来说说一种特殊情况,就是这个 UserTask 由任务的发起人处理,任务是谁发起的,谁来处理这个 UserTask。
这个首先需要在流程启动事件上设置任务的发起人变量名,如下,流程的启动节点,然后设置任务的发起人,截图如下:
接下来,在给 UserTask 设置处理人的时候,设置处理人和任务的发起人的变量是同一个,截图如下:
来看看对应的 XML 文件的内容是什么,代码如下:
<process id="demo01" name="demo01" isExecutable="true">
<documentation>demo01</documentation>
<startEvent id="startEvent1" flowable:initiator="INITATOR" flowable:formFieldValidation="true"></startEvent>
<userTask id="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" flowable:assignee="#{INITATOR}" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-71FB3A81-F753-419D-9A0A-2FC6E5361CED" sourceRef="startEvent1" targetRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"></sequenceFlow>
<endEvent id="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></endEvent>
<sequenceFlow id="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A" sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3" targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D"></sequenceFlow>
</process>
startEvent 中有一个 flowable:initiator=“INITATOR” 表示设置流程发起人的变量为 INITATOR。后续在 UserTask 中使用该变量即可。
将这个流程部署成功之后,按照如下方式启动流程,代码如下:
@Test
void test01() {
Authentication.setAuthenticatedUserId("javaboy");
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01");
logger.info("id:{},activityId:{}", pi.getId(), pi.getActivityId());
}
Authentication.setAuthenticatedUserId(“javaboy”); 表示设置流程的发起人为 javaboy。