Camunda-BPM中的过程变量

时间:2016-07-19 05:54:58

标签: java bpmn camunda

我有一个简单的bpmn进程Sample.bpmn 我正在使用2个服务任务,我正在使用执行我的过程 processEngine.getRuntimeService()。startProcessInstanceByKey(“Process_1”,变量); 我的变量如下:

Map variables = new HashMap();
variables.put("a", 2);
variables.put("b", 5);

我的第一个服务任务是实现Addition java类,我的第二个服务任务是实现乘法类。

现在我想要3个变量(常量)“c”,“d”和“e”使得c = 5,d = 10,e = 2这样我就可以使用我的“c”变量了服务任务1这样,除了类我可以使用这个变量,同样我想在我的乘法类中使用变量“d”和变量“e”我想全局定义,以便我可以在这两个类中使用它。

有人可以指导我吗?

3 个答案:

答案 0 :(得分:3)

作为快速修复,您可以将安装服务任务作为预先填充流程变量的流程的第一个任务。 根据您启动流程的方式,您可以: 通过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/

另一个简单的解决方案是具有静态值的类或包含所需值的枚举。

- 编辑 -

如果你想使用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表示并添加extensionElement。

答案 1 :(得分:1)

文档显示了存储值的两种不同方法:

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对象。但是,如果成员变量包含一些其他引用,那么这些引用也需要可序列化。为避免这种情况,您将声明这些引用为瞬态

此外,如果您不希望数据保存在DB中,请使用setVariableLocal方法

答案 2 :(得分:0)

要将变量创建为全球变量: org.camunda.bpm.engine.variable.Variables.putValue("keyName", VariableType);

要获取全局变量,请执行以下操作: VariableType value = (VariableType) delegateExecution.getVariable("getKey");

注意:您的dto必须可序列化,否则camnuda会抛出序列化错误。