如何在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 = 5d = 10e = 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 会抛出序列化错误。