【问题标题】:Camunda : get active tasksCamunda:获得活跃的任务
【发布时间】:2016-09-22 13:52:11
【问题描述】:

如何在 Camunda 中使用的代码中获取活动任务列表?

我已经看过这个答案“How to query the position of a process instance?”,但我不明白什么是“processInstanceId”以及我应该在哪里得到它才能使这个方法起作用。

这是我目前正在尝试的代码:

package org.camunda.bpm;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.camunda.bpm.model.bpmn.BpmnModelInstance;
import org.camunda.bpm.model.xml.instance.ModelElementInstance;

public class AllActiveActivities {

public Map<String, String> getAllActiveActivities(String processInstanceId) {
// get engine services
ProcessEngine processEngine = BpmPlatform.getDefaultProcessEngine()
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();

// get the process instance
ProcessInstance processInstance =
    runtimeService.createProcessInstanceQuery()
        .processInstanceId(processInstanceId)
        .singleResult();

HashMap<String, String> activityNameByActivityId = new HashMap<String, String>();

// get all active activities of the process instance
List<String> activeActivityIds =
    runtimeService.getActiveActivityIds(processInstance.getId());

// get bpmn model of the process instance
BpmnModelInstance bpmnModelInstance =
    repositoryService.getBpmnModelInstance(processInstance.getProcessDefinitionId());

for (String activeActivityId : activeActivityIds) {
  // get the speaking name of each activity in the diagram
  ModelElementInstance modelElementById =
      bpmnModelInstance.getModelElementById(activeActivityId);
  String activityName = modelElementById.getAttributeValue("name");

  activityNameByActivityId.put(activeActivityId, activityName);
}

// map contains now all active activities
return activityNameByActivityId;
}

}

提前感谢您的帮助。

【问题讨论】:

    标签: java bpmn business-process-management camunda


    【解决方案1】:

    以下语句将返回所有活动任务,也可以是独立任务。

    processEngine.getTaskService().createTaskQuery().active().list()
    

    如果要获取与特定正在运行的进程对应的所有活动任务,则必须将.processInstanceId(processInstanceId) 添加到.list() 之前的语句中。 processInstanceId 是标识流程实例的id。如果您启动流程/工作流程,将使用唯一 ID 创建流程实例。要获取这些 id,您可以例如执行以下语句。

    int processInstanceId = processEngine.getRuntimeService()
     .createProcessInstanceQuery()
     .processDefinitionKey(processDefinitionKey)
     .singleResult()
     .getId()
    

    变量processDefinitionKey是在流程定义xml中设置的id。

    【讨论】:

      【解决方案2】:

      流程实例是流程定义的当前正在执行的“实例”。 换句话说,每次您启动一个流程时,您都会创建一个流程“实例”。

      因此,对于任何给定的流程定义,您可能有许多“实例”,每个“实例”可能有一个更活跃的“任务”(有时是服务任务,有时是用户任务,有时是其他等待状态 - 例如计时器)。

      在回答您的问题之前,我需要了解您要检索的是什么。

      您是否正在查找给定流程定义的所有任务?如果是这样,这等同于所有“实例”的所有任务。为此,您将查询所有实例的流程定义,然后查询每个实例的所有任务。

      或者,您是否只查找单个实例的任务。您发布的代码将检索单个实例的任务,但您需要传入通过查询 runtimeService 以获取活动实例而不匹配所需查询参数(例如业务数据、流程变量或仅通过流程定义)检索的实例 ID。

      希望这会有所帮助,请让我们具体了解您想要实现的目标,我相信我们可以提供帮助。

      问候, 格雷格

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        相关资源
        最近更新 更多