如何在Camunda-bpm中检索流程变量?

问题描述 投票:0回答:3

在阅读时(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,或者还有其他方法吗?

java camunda bpmn.io
3个回答
4
投票

如果您想获取所有历史变量实例,请使用

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();

有关更多信息,请参阅文档 HistoryServiceHistoricVariableInstanceQuery


0
投票

对于遇到同样问题的任何人来说,用于启动流程的变量是流程变量,我们通过委托检索的变量是本地变量,因此您必须以某种方式访问流程实例。为了使您的代码正常工作,我将按如下方式重写它(将从实现 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);
 }

0
投票

我用的是可流动的。我可以毫无问题地获取这些 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();
© www.soinside.com 2019 - 2024. All rights reserved.