Camunda:获取活动任务
Camunda : get active tasks
如何在 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;
}
}
在此先感谢您的帮助。
流程实例是当前正在执行的 "instance" 流程定义。
换句话说,每次启动一个进程时,都会创建一个进程 "instance".
因此,对于任何给定的流程定义,您可能有多个 "instances",每个 "instance" 可能有一个更活跃的 "tasks"(有时是服务任务,有时是用户任务有时还有其他等待状态 - 例如计时器)。
在回答您的问题之前,我需要了解您要检索的内容。
您是否正在寻找给定流程定义的所有任务?如果是这样,这等同于所有 "instances" 的所有任务。为此,您将查询所有实例以获取流程定义,然后查询每个实例的所有任务。
或者,您是否只查找单个实例的任务。您发布的代码将检索单个实例的任务,但您需要传入通过查询 runtimeService 检索活动实例的实例 ID,而不是匹配您所需的查询参数(例如业务数据、流程变量或仅通过流程定义)。
希望这对您有所帮助,让我们具体了解您想要实现的目标,我相信我们可以提供帮助。
此致,
格雷格
以下语句将 return 所有活动任务,也可以是独立任务。
processEngine.getTaskService().createTaskQuery().active().list()
如果要获取与特定 运行 进程对应的所有活动任务,您必须将 .processInstanceId(processInstanceId)
添加到 .list()
之前的语句中。 processInstanceId
是标识流程实例的 id
。如果您启动一个 process/workflow 流程实例,将创建一个具有唯一 ID 的流程实例。要获取这些 id,您可以执行以下语句。
int processInstanceId = processEngine.getRuntimeService()
.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult()
.getId()
变量processDefinitionKey
是进程定义中设置的idxml。
如何在 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;
}
}
在此先感谢您的帮助。
流程实例是当前正在执行的 "instance" 流程定义。 换句话说,每次启动一个进程时,都会创建一个进程 "instance".
因此,对于任何给定的流程定义,您可能有多个 "instances",每个 "instance" 可能有一个更活跃的 "tasks"(有时是服务任务,有时是用户任务有时还有其他等待状态 - 例如计时器)。
在回答您的问题之前,我需要了解您要检索的内容。
您是否正在寻找给定流程定义的所有任务?如果是这样,这等同于所有 "instances" 的所有任务。为此,您将查询所有实例以获取流程定义,然后查询每个实例的所有任务。
或者,您是否只查找单个实例的任务。您发布的代码将检索单个实例的任务,但您需要传入通过查询 runtimeService 检索活动实例的实例 ID,而不是匹配您所需的查询参数(例如业务数据、流程变量或仅通过流程定义)。
希望这对您有所帮助,让我们具体了解您想要实现的目标,我相信我们可以提供帮助。
此致, 格雷格
以下语句将 return 所有活动任务,也可以是独立任务。
processEngine.getTaskService().createTaskQuery().active().list()
如果要获取与特定 运行 进程对应的所有活动任务,您必须将 .processInstanceId(processInstanceId)
添加到 .list()
之前的语句中。 processInstanceId
是标识流程实例的 id
。如果您启动一个 process/workflow 流程实例,将创建一个具有唯一 ID 的流程实例。要获取这些 id,您可以执行以下语句。
int processInstanceId = processEngine.getRuntimeService()
.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult()
.getId()
变量processDefinitionKey
是进程定义中设置的idxml。