如何在Camunda-BPM中设置全局流程变量?
How to set global process variables in Camunda-BPM?
我有一个简单的bpmn流程
其中我正在使用 2 个服务任务,我正在通过使用执行我的流程
processEngine.getRuntimeService().startProcessInstanceByKey("Process_1", variables);
我的变量如下:
Map variables = new HashMap();
variables.put("a", 2);
variables.put("b", 5);
服务任务 1 实现 Addition
java class,服务任务 2 实现 Multiplication
class.
现在我想要 3 个变量(常量)c = 5
、d = 10
、e = 2
,这样我就可以将 c
用于服务任务 1,这样 Addition
我可以使用这个变量,同样我想在我的 Multiplication
class 中使用 d
,并且 e
应该是全局的,这样我就可以在两者中使用它classes.
有人可以指导我吗?
作为快速修复,您可以将设置服务任务作为预填充流程变量的流程的第一个任务。
根据您开始流程的方式,您可以:
通过 java-object-api
设置变量
https://docs.camunda.org/manual/7.5/user-guide/process-engine/variables/#java-object-api
或者如果您使用 REST 调用,您可以在请求正文中提供这些固定值:
https://docs.camunda.org/manual/7.5/reference/rest/process-definition/post-start-process-instance/
另一个简单的解决方案是 class 具有静态值或包含所需值的枚举。
--编辑--
如果您想使用 inputOutput 扩展,请在您的 bpmn 文件中添加如下内容:
<bpmn:process id="Process_1" isExecutable="false">
<bpmn:extensionElements>
<camunda:inputOutput>
<camunda:inputParameter name="c">5</camunda:inputParameter>
<camunda:inputParameter name="d">10</camunda:inputParameter>
<camunda:inputParameter name="e">2</camunda:inputParameter>
</camunda:inputOutput>
</bpmn:extensionElements>
这不能在 camunda 建模器的图表视图中完成,只需切换到流程的 XML 表示并添加扩展元素。
文档显示了两种不同的值存储方式:
Java 对象 api
键入的值 api
我认为使用 Java 对象 api 需要 java 对象来实现可序列化接口?如果 Order 对象未实现 Serializable 接口
,则以下代码将中断
com.example.Order order = new com.example.Order();
runtimeService.setVariable(execution.getId(), "order", order);
com.example.Order retrievedOrder = (com.example.Order) runtimeService.getVariable(execution.getId(), "order");
==
我将为 java 对象使用以下格式
ObjectValue customerDataValue = Variables.objectValue(customerData)
.serializationDataFormat(Variables.SerializationDataFormats.JAVA)
.create();
execution.setVariable("someVariable", customerDataValue);
customerdata 指的是任何 java 对象。但是,如果成员变量包含一些其他引用,则这些引用也需要可序列化。为避免这种情况,您将把这些引用声明为 transient
此外,如果您不想将数据持久化到数据库中,请使用 setVariableLocal 方法
创建全局变量:org.camunda.bpm.engine.variable.Variables.putValue("keyName", VariableType);
获取全局变量: VariableType value = (VariableType) delegateExecution.getVariable("getKey");
注意: 你的 dto 必须是可序列化的,否则 camnuda 会抛出序列化错误。
我有一个简单的bpmn流程
其中我正在使用 2 个服务任务,我正在通过使用执行我的流程
processEngine.getRuntimeService().startProcessInstanceByKey("Process_1", variables);
我的变量如下:
Map variables = new HashMap();
variables.put("a", 2);
variables.put("b", 5);
服务任务 1 实现 Addition
java class,服务任务 2 实现 Multiplication
class.
现在我想要 3 个变量(常量)c = 5
、d = 10
、e = 2
,这样我就可以将 c
用于服务任务 1,这样 Addition
我可以使用这个变量,同样我想在我的 Multiplication
class 中使用 d
,并且 e
应该是全局的,这样我就可以在两者中使用它classes.
有人可以指导我吗?
作为快速修复,您可以将设置服务任务作为预填充流程变量的流程的第一个任务。 根据您开始流程的方式,您可以: 通过 java-object-api
设置变量https://docs.camunda.org/manual/7.5/user-guide/process-engine/variables/#java-object-api
或者如果您使用 REST 调用,您可以在请求正文中提供这些固定值:
https://docs.camunda.org/manual/7.5/reference/rest/process-definition/post-start-process-instance/
另一个简单的解决方案是 class 具有静态值或包含所需值的枚举。
--编辑--
如果您想使用 inputOutput 扩展,请在您的 bpmn 文件中添加如下内容:
<bpmn:process id="Process_1" isExecutable="false">
<bpmn:extensionElements>
<camunda:inputOutput>
<camunda:inputParameter name="c">5</camunda:inputParameter>
<camunda:inputParameter name="d">10</camunda:inputParameter>
<camunda:inputParameter name="e">2</camunda:inputParameter>
</camunda:inputOutput>
</bpmn:extensionElements>
这不能在 camunda 建模器的图表视图中完成,只需切换到流程的 XML 表示并添加扩展元素。
文档显示了两种不同的值存储方式:
Java 对象 api 键入的值 api
我认为使用 Java 对象 api 需要 java 对象来实现可序列化接口?如果 Order 对象未实现 Serializable 接口
,则以下代码将中断com.example.Order order = new com.example.Order();
runtimeService.setVariable(execution.getId(), "order", order);
com.example.Order retrievedOrder = (com.example.Order) runtimeService.getVariable(execution.getId(), "order");
==
我将为 java 对象使用以下格式
ObjectValue customerDataValue = Variables.objectValue(customerData)
.serializationDataFormat(Variables.SerializationDataFormats.JAVA)
.create();
execution.setVariable("someVariable", customerDataValue);
customerdata 指的是任何 java 对象。但是,如果成员变量包含一些其他引用,则这些引用也需要可序列化。为避免这种情况,您将把这些引用声明为 transient
此外,如果您不想将数据持久化到数据库中,请使用 setVariableLocal 方法
创建全局变量:org.camunda.bpm.engine.variable.Variables.putValue("keyName", VariableType);
获取全局变量: VariableType value = (VariableType) delegateExecution.getVariable("getKey");
注意: 你的 dto 必须是可序列化的,否则 camnuda 会抛出序列化错误。