有没有一种简单的方法可以查明进程是否在委托代码内的 UserTask 中等待?

Is there an easy way to find out if the process is waiting in a UserTask inside Delegation Code?

这个问题是关于 Camunda BPM 引擎的。

我想实现一个可以附加到任何进程事件的 ExecutionListener。此侦听器应将进程状态消息发送到消息队列。如果进程正在某处的 UserTask 中等待,则进程消息应包含进程的 "PENDING" 状态。

现在我想知道是否有一种简单的方法可以查明进程是否在委托代码内的 UserTask 中等待(某处)(通过使用提供的委托代码方法的 DelegateExecution 对象)。目前找不到。

有一个接口TaskListener。您可以自己实现它,并在 BPMN 代码中为每个 UserTask 附加您自己的 TaskListener。您还可以定义您自己的 TaskListener 应在哪种事件类型上执行(创建、分配、完成、删除)。

notify-方法使用 DelegateTask 调用,其中包含有关具体 UserTask 的更多特定信息。您可以提取信息并将这些信息发送到您的队列中(当您在创建事件上调用 TaskListener 的实现时)。

否则您可以使用 TaskService 创建一个查询来检索所有打开的任务。对于工作查询,您需要当前执行的流程实例 ID,您可以从委托执行中检索它。为简化起见,请使用以下代码片段:taskService.createTaskQuery().processInstanceId(delegateExecution.ge‌​tProcessInstanceId()‌​).list().isEmpty()

例如:

import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.runtime.ActivityInstance;

public class ExampleExecutionListener implements ExecutionListener {

  public void notify(DelegateExecution execution) throws Exception {
    RuntimeService runtimeService = execution.getProcessEngineServices().getRuntimeService();
    ActivityInstance activityInstance = runtimeService.getActivityInstance(execution.getProcessInstanceId());

    boolean isInAnyUserTask = isInAnyUserTask(activityInstance);
  }

  protected boolean isInAnyUserTask(ActivityInstance activityInstance) {
    if ("userTask".equals(activityInstance.getActivityType())) {
      return true;
    }
    else {
      for (ActivityInstance child : activityInstance.getChildActivityInstances()) {
        boolean isChildInUserTask = isInAnyUserTask(child);
        if (isChildInUserTask) {
          return true;
        }
      }

      return false;
    }
  }
}

请注意,这不考虑调用的流程实例。

DelegateExecution 没有您需要的所有信息。您将必须使用任务查询来查看它是否 returns 在当前 运行.

的流程实例上至少有 1 个结果