@[toc]上一篇宋哥给大家分享了Flowable中的ReceiveTask。这只是流程中的一种任务。今天我们将看看另一个更常见的任务。任务--UserTask。从UserTask的名字就可以看出是需要人工干预的,人工处理的方式有很多种。我们可以设置该节点要处理哪个用户,或者是要处理哪个用户组(相当于要处理哪个角色)。今天这篇文章主要和大家分享三种设置用户的方法。至于如何设置用户组,我们会在下一篇文章中讲到。现在,假设我有一个简单的流程图如下:如何设置这个用户节点的处理程序?1、第一种指定具体用户的方式,我们画流程图的时候,可以选择这个节点,然后直接设置流程的处理器,如下:然后在打开的窗口中选择一个固定值,设置具体分配用户是javaboy,如下图:好了,现在这个节点固定由一个叫javaboy的用户来处理。对应的XML文件如下:demo01<序列enceFlowid="sid-DEBE03CD-F247-4EF3-BB67-ABBA94739B0A"sourceRef="sid-5F901234-AFF1-480E-9D66-2D196B910BA3"targetRef="sid-D0B9E5BF-8C1A-4F8F-B2C2-F423F5DC556D>上面这段XML,小伙伴们看到UserTask节点中有一个flowable:assignee="javaboy",这句话是设置这个UserTask的handler接下来我们部署启动这个流程(具体部署启动方法,请参考本系列之前的文章。启动后,我们在数据库的ACT_RU_TASK表中可以看到这个UserTask的handler是javaboy,如下图:现在我们可以通过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在查询到这个任务后有两个选择:将这个任务分配给另一个人,比如zhangsan。自己处理。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">朋友看到了,UserTask节点中的flowable:assignee=#{manager}”表示这个UserTask的handler由manager变量指定对于这样一个过程,我们需要在上一个节点指定下一个节点的处理器。对于目前的情况,当然在进程启动时,我们必须指定UserTask的处理器。方法如下:@Testvoidtest01(){Mapvariables=newHashMap<>();variables.put("经理","javaboy");ProcessInstancepi=runtimeService.startProcessInstanceByKey("demo01",变量);logger.info("id:{},activityId:{}",pi.getId(),pi.getActivityId());}进程启动成功后,查看ACT_RU_TASK表,可以看到有要处理的UserTask。是javaboy,如下图所示:如果能看到这条记录,说明我们已经成功设置了这个UserTask的handler。具体处理逻辑参见1.1和1.2节。3、通过监听器设置当然,我们也可以通过监听器来设置任务处理器。具体方法如下:首先,我们在绘制流程图的时候,不需要给UserTask分配用户,如下图所示:然后我们为这个UserTask设置一个任务监听器,步骤如下:先点击+号,然后选择CREATE事件,最后给出事件对应的实体类如下:当然这个实体类是我们项目中真正的类,如下:publicclassMyTaskListenerimplementsTaskListener{@重写publicvoidnotify(DelegateTaskdelegateTask){delegateTask.setAssignee("javaboy");}}创建UserTask时,将触发侦听器以设置UserTask的处理程序。让我们看看这个流程图对应的XML文件是什么样子的:"true">朋友看,event="create"class="org.javaboy.flowableidm.MyTaskListener"就是我们设置的,现在我们部署启动这个进程,当我们进程启动的时候,我们可以在ACT_RU_TASK表Task中看到一个javaboypending进程。4.其他情况最后,说一个特殊的情况,就是UserTask是由任务的发起者来处理的,谁发起任务,谁来处理UserTask,这个首先需要在流程启动事件上设置任务的变量名initiator如下,流程的起始节点,然后设置task的initiator:接下来在为UserTask设置handler的时候,设置handler和task的initiator的变量是一样的,如图下图中:OK,就这样。来看看对应的XML文件:demo01startEvent中有一个flowable:initiator="INITATOR",表示进程的发起者的变量设置为INITATOR,然后在UserTask中使用。进程结束后部署成功,启动流程如下:@Testvoidtest01(){Authentication.setAuthenticatedUserId("javaboy");ProcessInstancepi=runtimeService.startProcessInstanceByKey("demo01");logger.info("id:{},activityId:{}",pi.getId(),pi.getActivityId());}Authentication.setAuthenticatedUserId("javaboy");表示设置进程的发起者是javaboy。那么今天的文章介绍如何为UserTask设置handlerwith朋友们,稍后宋哥会和大家分享如何为UserTask设置候选人和候选人组。