activity网关使用

本文详细介绍了activity网关的类型和用法,包括排他网关、并行网关和包容网关。排他网关依据条件选择一条出路;并行网关允许分支并行执行并在汇聚点合并;包容网关结合了排他和并行网关的特性,可并行执行符合条件的多个分支。通过示例代码展示了各网关在实际业务场景中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是网关

网关用来控制流程的流向,简而言之,当流程实例在运转过程中,从一个节点跳转到下一个节点时,需要人为的控制某些条件,即只有满足这些条件的时候才会触发节点的跳转时,就可以考虑使用网关

常用的网关

activity提供了多种网关可供选择使用,从插件的流程设计器中大致可以看到有多种网关,分别是:并行网关、排他网关、包含网关以及基于事件类型的网关
在这里插入图片描述

排他网关 Exclusive Gateway

排他网关又叫互斥网关,条件计算为true的顺序流才会被选择继续流程,有且只有一条流程出线的出口,如果出现多个条件为true,则会默认选择第一条true来执行,如果没有条件输出true,流程走到这一步的时候则会报错

并行网关 Parallel Gateway

它可以将执行分支(fork)为多条路径,也可以合并(join)执行的多条入口路径。简单来说就是,并行网关它可以有多条入口和出口,并在合并入口处会等待其他分支执行完࿰

### activity并行网关动态生成多个并行任务 在Activiti框架中,`并行网关`用于支持流程中的分支和汇聚操作。当涉及到动态生成多个并行任务时,可以通过配置XML文件或者编程的方式实现这一需求。 #### XML定义方式 如果需要动态生成多个并行任务,则可以在BPMN模型设计阶段预留扩展点,在实际运行过程中通过Java代码动态修改这些任务的数量或属性。例如: ```xml <parallelGateway id="forkGateway" name="Fork Gateway"/> <!-- 动态生成的任务 --> <userTask id="dynamicTask1" name="Dynamic Task 1"/> <sequenceFlow sourceRef="forkGateway" targetRef="dynamicTask1"/> <userTask id="dynamicTask2" name="Dynamic Task 2"/> <sequenceFlow sourceRef="forkGateway" targetRef="dynamicTask2"/> <parallelGateway id="joinGateway" name="Join Gateway"/> <sequenceFlow sourceRef="dynamicTask1" targetRef="joinGateway"/> <sequenceFlow sourceRef="dynamicTask2" targetRef="joinGateway"/> ``` 此部分可以作为模板基础结构[^1]。 #### 编程方式调整任务数量 为了真正达到动态效果,通常会在启动流程实例之前或期间设置变量来控制具体的分支逻辑。以下是基于Java API的操作方法之一: ```java // 获取流程引擎组件 RuntimeService runtimeService = processEngine.getRuntimeService(); RepositoryService repositoryService = processEngine.getRepositoryService(); // 部署带占位符的流程定义 repositoryService.createDeployment() .addClasspathResource("process-with-dynamic-tasks.bpmn20.xml") .deploy(); // 启动流程前准备参数列表 (假设要创建三个动态任务) List<String> taskNames = Arrays.asList("Review Document", "Approve Budget", "Check Compliance"); // 将参数传递给流程上下文中 Map<String, Object> variables = new HashMap<>(); variables.put("taskCount", taskNames.size()); variables.put("tasks", taskNames); runtimeService.startProcessInstanceByKey("my-process-key", variables); ``` 在此示例中,`taskCount` 和 `tasks` 是自定义业务变量,它们会被下游服务任务或其他脚本读取以决定下一步骤的行为[^3]。 #### 使用监听器增强灵活性 对于更复杂的场景,还可以利用Activiti提供的生命周期事件机制——即`ExecutionListener` 或者 Script Tasks 来进一步定制化行为模式。比如下面这个例子展示了如何在一个特定位置插入额外的工作项: ```java public class DynamicTaskCreator implements ExecutionListener { @Override public void notify(DelegateExecution execution) throws Exception { List<String> tasksToCreate = (List<String>)execution.getVariable("tasks"); for(String taskName : tasksToCreate){ TaskService taskService = execution.getEngineServices().getTaskService(); org.activiti.engine.task.Task dynamicTask = taskService.newTask(); dynamicTask.setName(taskName); dynamicTask.setAssignee((String)execution.getVariable("assignee")); taskService.saveTask(dynamicTask); } } } ``` 这段代码片段展示的是如何根据传入的数据源批量新增待办事项记录[^4]。 --- ### 总结 综上所述,虽然标准版的Activiti BPMN不直接提供完全自由形式的“无限”分叉能力,但是借助于灵活运用内置API以及外部集成手段完全可以满足大多数企业级应用的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码农叔叔

谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值