在 ServiceTask 执行中找不到自己的流程实例

Own process instance can not be found inside a ServiceTask execution

我在流程开始后立即实施了 Camunda ServiceTask class (JavaDelegate)。在此任务中,我 运行 为 own 流程实例创建了一个 ProcessInstanceQuery(不要问为什么)。令人惊讶的是,查询结果为空 - 我不明白这是怎么发生的。

为了重现该问题,我在 GitHub 创建了一个非常简单的演示项目。

这是过程

这是我的HelloWorldTask执行代码

@Override
public void execute(DelegateExecution execution) throws Exception {

    String processInstanceId = execution.getProcessInstanceId();

    System.out.println(
            "Entering HelloWorldTask.execute (processInstanceId=" + processInstanceId + ")");

    ProcessInstanceQuery query =
            runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId);
    ProcessInstance pi = query.singleResult();

    if (pi == null) {
        System.out
                .println("WARN - No process instance with id " + processInstanceId + " found!");
    } else {
        System.out.println("Hello World!");
    }

    System.out.println(
            "Exiting HelloWorldTask.execute (processInstanceId=" + processInstanceId + ")");

}

有一个单元测试 hello.word.HelloWorldTest.helloWorld() 可用于启动进程。不幸的是,输出是

Entering HelloWorldTask.execute (processInstanceId=4)
WARN - No process instance with id 4 found!
Exiting HelloWorldTask.execute (processInstanceId=4)

任何人都可以解释这种行为。对我很有帮助。

由于您没有等待状态,事务未完成,这意味着数据库中没有流程实例,直到流程结束。

要通过委托执行访问流程实例,只需使用 execution.getProcessInstance() 方法。 这个方法returns本身,如果委托执行当前是流程实例。在你的情况下,它将是相同的执行。

有关 Camunda 引擎中等待状态和事务边界的更多信息,请参阅 documentation