上一篇宋哥给大家分享了Flowable中的ReceiveTask。这只是流程中的一种任务。今天我们来看另一个比较常见的Task——UserTask。从UserTask的名字就可以看出是需要人工干预的,人工处理的方式有很多种。我们可以设置该节点要处理哪个用户,或者是要处理哪个用户组(相当于要处理哪个角色)。今天这篇文章主要和大家分享三种设置用户的方法。至于如何设置用户组,我们会在下一篇文章中讲到。现在,假设我有一个简单的流程图如下:如何设置这个用户节点的处理程序?1、第一种指定具体用户的方式,我们画流程图的时候,可以选择这个节点,然后直接设置流程的处理器,如下:然后在打开的窗口中选择一个固定值,设置具体分配用户为javaboy,如下图:好了,现在这个节点固定由一个名为javaboy的用户处理。对应的XML文件如下:demo01在上面的XML中,小伙伴们看到UserTask节点中有一个flowable:assignee="javaboy",这句话就是设置这个的UserTask的handler接下来我们部署并启动这个流程(具体的部署和启动方法可以参考本系列之前的文章),启动之后我们可以在数据库的ACT_RU_TASK表中看到这个UserTask的handler如下图所示:现在我们可以通过Java代码查询javaboy需要处理的UserTask,如下:@AutowiredTaskServicetaskService;@Testvoidtest11(){Listlist=taskService.createTaskQuery().taskAssignee("javaboy").list();for(Tasktask:list){logger.info("id:{},name:{}",task.getId(),task.getName());}}这个查询本质上是对ACT_RU_TASK表中的查询,我们看一下执行的SQL:查询完这个任务,javaboy有两个选择:把这个任务交给另一个人,比如张三,自己处理。1.1重新指定taskhandler假设javaboy查询到自己的task后,想把task交给zhangsan处理。方法如下:@AutowiredTaskServicetaskService;@Testvoidtest11(){Listlist=taskService.createTaskQuery().taskAssignee("javaboy").list();for(Tasktask:list){taskService.setAssignee(task.getId(),"zhangsan");}}这行代码执行完后,我们查看数据库中的ACT_RU_TASK表,还是刚才的记录,只是handler变了zhangsan:朋友看到版本号从1变成了2,说明此记录已更新,处理程序已从javaboy更改为zhangsan。最后我们来看一下这个操作执行的SQL,来验证我们之前的结论:朋友们注意这里执行的SQL以及对应的参数,说明我们上面的分析是正确的。1.2自己处理如果javaboy想自己处理这个任务,方法如下:@AutowiredTaskServicetaskService;@Testvoidtest11(){Listlist=taskService.createTaskQuery().taskAssignee("javaboy").列表();for(Tasktask:list){taskService.complete(task.getId());}}处理完成后,ACT_RU_TASK表中的记录也会被自动删除(已执行的UserTasks会被自动删除)。此方法指定特定用户。显然,这种硬编码的方式使用起来非常不方便。我们需要的是一种可以动态指定任务处理程序的方法。2.通过变量设置如果想动态指定UserTask的handler,可以使用变量来实现。具体做法如下:在画流程图的时候,还是指定流程具体的handler,但是指定的时候,改用变量,如下图:#{manager}这里的意思是这个UserTask是由一个指定的名为manager的变量,此时的XML文件如下:formFieldValidation="true">5"可以看到,UserTask节点中的flowable:assignee="#{manager}"表示这个UserTask的handler是由manager变量指定的。对于这样一个流程,我们在上一个节点需要指定下一个节点的handler。对于当前的情况,当然,当进程启动时,UserTask的处理程序应该指定如下:@Testvoidtest01(){Mapvariables=newHashMap<>();variables.put("经理","javaboy");ProcessInstancepi=runtimeService.startProcessInstanceByKey("demo01",变量);logger.info("id:{},activityId:{}",pi.getId(),pi.getActivityId());}进程启动成功后,查看ACT_RU_TASK表,可以看到有pendingUserTask,processor为javaboy,如下图:可以看到这条Record,说明这个UserTask的handler设置成功了。具体处理逻辑参见1.1和1.2节。3、通过监听器设置当然,我们也可以通过监听器来设置任务处理器。具体方法如下:首先,我们在画流程图的时候,不需要给UserTask分配用户,如下图:然后我们为这个UserTask设置一个任务监听器,步骤如下:首先点击+号,然后选择CREATE事件,最后给出事件对应的实体类,如下:当然这个实体类是我们项目中真正的类,如下:publicclassMyTaskListenerimplementsTaskListener{@Overridepublicvoidnotify(DelegateTaskdelegateTask){delegateTask.setAssignee("javaboy");}}创建UserTask时,将触发侦听器以设置UserTask的处理程序。让我们看看这个流程图对应的XML文件是什么样子的:"true"></sequenceFlow>可以看到,event="create"class="org.javaboy.flowableidm.MyTaskListener"是我们设置的。现在我们部署并开始这个过程。当我们的进程启动时,可以在ACT_RU_TASK表中看到一个javaboy挂起的任务。4.其他情况最后说一下一种特殊情况,即UserTask由任务的发起者处理。发起任务的人将处理UserTask。这首先需要在流程启动事件上设置任务的启动器变量名,如下,流程的启动节点,然后设置任务的启动器:接下来,在为UserTask设置handler的时候,设置handler和任务的发起者变量相同,如下图所示:嗯,这样就可以了。来看看对应的XML文件:demo01startEvent中有一个flowable:initiator="INITATOR",表示设置了进程启动器的变量到INITATOR和随后在UserTask中使用这个变量即可。流程部署成功后,启动流程如下:;logger.info("id:{},activityId:{}",pi.getId(),pi.getActivityId());}Authentication.setAuthenticatedUserId("javaboy");表示设置过程的发起者是javaboy好了,今天这篇文章就是我和小伙伴们介绍了如何为UserTask设置handlers,后面宋哥给大家分享一下如何为UserTask设置candidates和candidategroups。