如何在Camunda 8运行时通过Java逻辑更新流程变量?
在Camunda 8 Java逻辑中运行时更新流程变量
Camunda 8基于Zeebe引擎,API体系和Camunda 7差异较大,没有RuntimeService这类组件,需通过Zeebe Java客户端实现流程变量的运行时更新。以下是对应Camunda 7实现的等效方案:
1. 添加Zeebe客户端依赖
首先在项目中引入Zeebe Java客户端依赖(以Maven为例):
<dependency> <groupId>io.camunda</groupId> <artifactId>zeebe-client-java</artifactId> <version>8.5.0</version> <!-- 使用与你的Camunda 8集群匹配的版本 --> </dependency>
2. 完整实现代码
初始化Zeebe客户端
// 初始化Zeebe客户端,替换为你的集群网关地址 ZeebeClient client = ZeebeClient.newClientBuilder() .gatewayAddress("localhost:26500") .usePlaintext() // 生产环境建议使用TLS加密 .build();
查询活跃流程实例并更新变量
场景1:更新流程实例全局变量(对应Camunda 7流程实例级变量)
// 查询指定流程定义的活跃流程实例 List<ProcessInstance> activeInstances = client.newListProcessInstancesCommand() .processDefinitionKey(processKey) .state(ProcessInstanceState.ACTIVE) .send() .join() .getProcessInstances(); // 遍历更新每个流程实例的全局变量 activeInstances.forEach(instance -> { client.newSetVariablesCommand(instance.getProcessInstanceKey()) .variables(Map.of(variableName, variableValue)) .send() .join(); });
场景2:更新元素实例局部变量(对应Camunda 7 Execution级局部变量)
如果需要更新流程中特定执行节点(如用户任务、服务任务)的局部变量,需先查询流程实例下的活跃元素实例:
// 查询指定流程定义的活跃流程实例 List<ProcessInstance> activeInstances = client.newListProcessInstancesCommand() .processDefinitionKey(processKey) .state(ProcessInstanceState.ACTIVE) .send() .join() .getProcessInstances(); // 遍历每个流程实例,查询其下的活跃元素实例并更新局部变量 activeInstances.forEach(instance -> { List<ProcessInstance> elementInstances = client.newListProcessInstancesCommand() .parentProcessInstanceKey(instance.getProcessInstanceKey()) .state(ProcessInstanceState.ACTIVE) .send() .join() .getProcessInstances(); elementInstances.forEach(elementInstance -> { client.newSetVariablesCommand(elementInstance.getProcessInstanceKey()) .variables(Map.of(variableName, variableValue)) .local(true) // 标记为局部变量,仅当前元素实例可见 .send() .join(); }); });
关键说明
- Camunda 8中没有
Execution概念,取而代之的是流程实例(全局执行上下文)和元素实例(流程中具体执行的节点)。 local(true)参数用于设置局部变量,仅当前元素实例可见;不设置则默认是全局变量,整个流程实例可访问。- 操作完成后记得关闭客户端释放资源:
client.close();
内容的提问来源于stack exchange,提问作者Sonam
相关产品推荐
相关产品推荐

