我有一个简单的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”我想全局定义,以便我可以在这两个类中使用它。
有人可以指导我吗?
答案 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会抛出序列化错误。