在阅读时(https://docs.camunda.org/manual/7.5/user-guide/process-engine/variables/)我不确定如何检索变量?
目前我正在努力找出如何访问先前设置的过程变量。我尝试的是:
我有一个简单的 bpmn 流程,其中有开始事件、1 个服务任务和结束事件,我通过传递 2 个变量(a 和 b)来启动我的流程,我的服务任务正在实现以下 java 类:
public class Addition implements JavaDelegate {
public void execute(DelegateExecution exe) throws Exception {
System.out.println("Inside calculator again");
Integer x = (Integer) exe.getVariable("a");
Integer y = (Integer) exe.getVariable("b");
int add = x+y;
System.out.println("Addition of two number is"+add);
exe.setVariable("add",add);
}
我的流程如下:
public void sayHello(ProcessEngine processEngine)
{
Map<String,Object> variables = new HashMap<String, Object>();
variables.put("a", 3);
variables.put("b", 5);
ProcessInstance instance= processEngine.getRuntimeService().startProcessInstanceByKey("Process_3", variables);
}
我想访问 sayHello 类中的
add
变量(存在于 Addition 类中)?
由于流程已完成,因此我无法使用runtimeService,因此我尝试使用历史记录服务,但找不到任何解决方案。
有没有我可以使用的Java API,或者还有其他方法吗?
如果您想获取所有历史变量实例,请使用
list
中的 HistoricVariableInstanceQuery
方法。
例如
List<HistoricVariableInstance> variables = processEngine.getHistoryService().createHistoricVariableInstanceQuery.list();
如果您想获取具有给定名称的特定变量,您可以使用该方法
variableName(String)
例如:
List<HistoricVariableInstance> variables = processEngine.getHistoryService().createHistoricVariableInstanceQuery().variableName("myVar").list();
要获取特定流程实例的变量,请使用方法
processInstanceId
例如:
List<HistoricVariableInstance> variables = processEngine.getHistoryService().createHistoricVariableInstanceQuery().processInstanceId(processInstance.getId()).variableName("myVar").list();
有关更多信息,请参阅文档 HistoryService 和 HistoricVariableInstanceQuery
对于遇到同样问题的任何人来说,用于启动流程的变量是流程变量,我们通过委托检索的变量是本地变量,因此您必须以某种方式访问流程实例。为了使您的代码正常工作,我将按如下方式重写它(将从实现 JavaDelegate 更改为实现 ActivityBehavior 并获取必须通过调用 getParent() 的变量)。
public class Addition implements ActivityBehavior{
public void execute(ActivityExecution exe) throws Exception {
System.out.println("Inside calculator again");
int x = (int) exe.getParent().getVariable("a");
int y = (int) exe.getParent().getVariable("b");
int add = x+y;
System.out.println("Addition of two number is: " + add);
exe.setVariable("add",add);
}
sayHello 方法不会改变
public void sayHello(ProcessEngine processEngine)
{
Map<String,Object> variables = new HashMap<String, Object>();
variables.put("a", 3);
variables.put("b", 5);
ProcessInstance instance=
processEngine.getRuntimeService().startProcessInstanceByKey("Process_3", variables);
}
我用的是可流动的。我可以毫无问题地获取这些 processInstance 级别的变量。它们位于根级别。所有的execution、taskservice、javaDelegate都可以把它们取出来。我想卡蒙达也是一样。
从 ACT_RU_VARIABLE 中选择 *
//设置
ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder().processDefinitionKey(key)
.variable(AppConstants.TENANT_ID, tenantId)
.variable(AppConstants.CONSUMER_ID, consumerId)
.start();
//来自任务服务
Task currentTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
var testVariable = taskService.getVariables(currentTask.getId());
//来自JavaDelegate
public class notificationService implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
Map<String, Object> variables = execution.getVariables();
String str = variables.get(AppConstants.TENANT_ID) + " "
+ variables.get(AppConstants.CONSUMER_ID) + " "
+ execution.getProcessInstanceId();