Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一种简单的方法可以确定流程是否在委托代码中的UserTask中等待?_Java_Camunda - Fatal编程技术网

Java 是否有一种简单的方法可以确定流程是否在委托代码中的UserTask中等待?

Java 是否有一种简单的方法可以确定流程是否在委托代码中的UserTask中等待?,java,camunda,Java,Camunda,此问题与Camunda BPM引擎有关 我想实现一个ExecutionListener,可以附加到任何流程事件。此侦听器应将进程状态消息发送到消息队列。如果流程正在某个地方等待UserTask,则流程消息应包含流程的“挂起”状态 现在,我想知道是否有一种简单的方法可以确定流程是否正在委托代码内的UserTask中等待(某处)(通过使用委托代码方法提供的DelegateExecution对象)。到目前为止找不到。有一个接口TaskListener。您可以自己实现它,并将自己的TaskListene

此问题与Camunda BPM引擎有关

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


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

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

notify
-方法通过一个
DelegateTask
调用,该任务包含关于具体用户任务的更具体信息。您可以提取信息并将这些信息发送到队列中(在创建事件上调用
TaskListener
的实现时)


否则,您可以使用
TaskService
创建查询以检索所有打开的任务。对于工作查询,您需要当前执行的流程实例id,您可以从委托执行中检索该id。简而言之,请使用以下代码片段:
taskService.createTaskQuery().processInstanceId(delegateExecution.ge‌​tprocesinstanceId()‌​).list().isEmpty()

有一个接口
TaskListener
。您可以自己实现它,并将自己的
TaskListener
附加到BPMN代码中的每个用户任务中。您还可以定义自己的
TaskListener
应该执行的事件类型(创建、分配、完成、删除)

notify
-方法通过
DelegateTask
调用,该任务包含有关具体用户任务的更具体信息。您可以提取信息并将这些信息发送到队列中(在创建事件上调用
tasklister
的实现时)

否则,您可以使用
TaskService
创建一个查询,以检索所有打开的任务。对于工作查询,您需要当前执行的流程实例id,您可以从委托执行中检索该id。要简化此代码段:
TaskService.createTaskQuery().processInstanceId(delegateExecution.ge)‌​tprocesinstanceId()‌​).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;
    }
  }
}

注意,这不被称为过程实例。

例如:

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;
    }
  }
}

注意,这不被称为进程实例。

执行委托并没有您需要的所有信息。您必须使用任务查询来查看它是否在当前正在运行的进程实例上返回至少1个结果。

委托>执行没有您需要的所有信息。ave需要使用任务查询来查看它是否在当前正在运行的流程实例上返回至少一个结果。

当时我实现了一个
ExecutionListener
,它工作得很好。我只需要知道是否有办法通过
notify
方法来确定流程是否在UserTask中等待现在在我的工作站上没有一个可工作的camunda安装。但是你看过
org.camunda.bpm.engine.TaskService
?我正在看的方法是
TaskService.createTaskQuery().active().list();
方法。也许这会对您有所帮助。谢谢-运行任务查询可能会完成这项工作,但我想知道通过
DelegateExecution
对象是否有更简单的解决方案。不,我不这么认为。几个月前我也搜索过类似的解决方案。我当时意识到,您不能从当前的
DelegateExecution
跳转>到更高的级别(“主流程实例”),查看流程正在等待另一个用户任务的位置。因此,您需要更多的服务。例如
task-
RuntimeService
最终接受@thorbens的回答,因为它(连同注释)对我的特殊问题给出了最全面的答案-而这个答案只影响我在一段中的特定问题。尽管如此,这段中解释的解决方案是我解决方案的一部分,因此感谢和+1。目前,我实现了一个
ExecutionListener
,它运行良好。我只需要知道是否有在
notify
方法中,找出进程是否在UserTask中等待的方法我的工作站上现在没有正在工作的camunda安装。但是你看过
org.camunda.bpm.engine.TaskService
了吗?我正在看的方法是
TaskService.createTaskQuery().active().list();
方法。也许这会对您有所帮助。谢谢-运行任务查询可能会完成这项工作,但我想知道通过
DelegateExecution
对象是否有更简单的解决方案。不,我不这么认为。几个月前我也搜索过类似的解决方案。我当时意识到,您不能从当前的
DelegateExecution
跳转>到更高的级别(“主流程实例”),查看流程正在等待另一个用户任务的位置。因此,您需要更多的服务。例如
task-
RuntimeService
最终接受@thorbens的回答,因为它(连同注释)对我的特殊问题给出了最全面的答案,而这个答案只在一段中影响到我的特殊问题。然而,这段中解释的解决方案是我解决方案的一部分,因此,感谢和+1。这只表明我