activiti的网关(GateWay)

2025-05-06 15:30:01 世界杯经典歌曲

在介绍activiti的基础的时候说到了工作流的使用场景之请假,请假的天数不同,可能需要不同的领导签字,本篇文章讲介绍工作流的网关实现这类场景。

activiti中的网关包含以下几种,这里只做下简单的介绍,具体的细节信息可以参考网上资料。

(1)ParallelGeteway:并行网关/异或网关 (多人会签完成,才能启动下一流程)

(2)ExclusiveGateway排他网关(多人之中只能有一个人进行审批,哪个条件为true,则走对应的逻辑)

(3)InclusiveGateway包含网关(集成了并行与排他网关)

(4)EventGateway事件网关(只能连接中间捕获事件)

话不多说,开始案例。步骤还是和我上一篇的文章一样,绘画流程图、配置属性--->部署流程--->启动流程--->执行任务

绘画流程图:相信只要你有点流程图的基础,都能看懂流程走向

配置(重要)

(1)每个节点配置办理人,我这边从上到下,从左到右,分别配置的张三、李四、王二、麻子四个人。

(2)事件到底走哪个分支,这个是需要我们配置的,点击连线,properties下面的main config,找到condition,如图所示,在里面配置条件。注意:这里面是个条件表达式,这个day是可以自行定义的,你也可以取别的参数,在你完成请假申请的时候,传这个参数值就可以了。用专业术语来说,就是配置参数变量的值。

同样的,另外两条线,也需要配置下Condition的值,最后点击空白处,给该流程起个key和name。我这里起的key是applyLeave,就不做截图展示了。

接下来部署流程和启动流程我就一起上代码了。

@Test

public void ExclusiveGateWay(){

//发布流程

Deployment deployment = processEngine.getRepositoryService()

.createDeployment()

.name("排他网关")

.addClasspathResource("diagrams/exclusiveWay.bpmn")

.addClasspathResource("diagrams/exclusiveWay.png")

.deploy();

System.out.println("部署ID:"+deployment.getId());

System.out.println("部署名称:"+deployment.getName());

//启动流程

ProcessInstance pi = processEngine.getRuntimeService()

.startProcessInstanceByKey("applyLeave");

}

查询任务

public void MyPersonalTask(){

String assignee = "张三";

List list = processEngine.getTaskService()//与正在执行的任务管理相关的Service

.createTaskQuery()//创建任务查询对象

/**排序*/

.orderByTaskCreateTime().asc()//使用创建时间的升序排列

/**返回结果集*/

.list();//返回列表

for(Task task:list){

System.out.println("任务ID:"+task.getId());

System.out.println("任务名称:"+task.getName());

System.out.println("任务的办理人:"+task.getAssignee());

System.out.println("流程实例ID:"+task.getProcessInstanceId());

System.out.println("执行对象ID:"+task.getExecutionId());

System.out.println("流程定义ID:"+task.getProcessDefinitionId());

}

}

完成任务

@Test

public void completeeTask() {

TaskService taskService = processEngine.getTaskService();

String taskId = "2408"; //这里的id就是我们上一步通过查看任务,获取的任务id

Map variables = new HashMap();

variables.put("day", 7); //这里设置我们刚才配置参数对应的值,这里设置的7,那么应该到总经理审批

Task task = taskService.createTaskQuery()

.taskId(taskId)

.singleResult();

taskService.addComment(taskId, task.getProcessInstanceId(), "7天假期审核通过"); //在这里我们可以对任务添加评论

taskService.complete(taskId, variables);

}

测试:先是张三提交了7天的申请,现在我们来验证接下来是否到总经理审批,通过截图,证明了我们流程中的排他网关是成功的。

并行网关我就不做测试了,感兴趣的朋友可以自己画图配置测试看看,其实通过这篇和上一篇的案例我们可以发现到,工作流只要你流程画好了,配置好了,剩下的都是一样的操作了,部署启动流程,查看任务,完成流程等。

最后做下补充:关于上面提到的变量

在实际过程中,我们常常会运用到变量的配置以及值获取等问题。可以通过runtimeService或者taskService来设置变量和获取变量,变量可以设置一个或者多个。对应的表act_ru_variable:正在执行的流程变量表 ; act_hi_varinst:流程变量历史表

runtimeService.setVariable(executionId, variableName, value)//表示使用执行对象ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)

// runtimeService.setVariables(executionId, variables)//表示使用执行对象ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)

// taskService.setVariable(taskId, variableName, value)//表示使用任务ID,和流程变量的名称,设置流程变量的值(一次只能设置一个值)

// taskService.setVariables(taskId, variables)//表示使用任务ID,和Map集合设置流程变量,map集合的key就是流程变量的名称,map集合的value就是流程变量的值(一次设置多个值)

runtimeService.startProcessInstanceByKey(processDefinitionKey, variables);//启动流程实例的同时,可以设置流程变量,用Map集合

流程变量的赋值:可以在启动流程的时候赋值,也可以在某个节点完成任务的时候赋值,这个都是可以的,具体情况看你的业务需求。

下一篇我们会讲到另一个常用的点-->监听器。