2016-09-22 349 views
0

我如何獲得我在Camunda中使用的代碼中的活動任務列表?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; 
} 

} 

在此先感謝您的幫助。

回答

3

下面的語句將返回所有正在運行的任務,它可以是獨立的也任務。

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

如果你想獲得對應於特定運行過程中的所有活動任務你有.list()之前的.processInstanceId(processInstanceId)添加的語句。 processInstanceId是標識流程實例的id。如果您啓動一個流程/工作流程,則會使用唯一的ID創建流程實例。爲了得到這些id,你可以例如執行下面的語句。

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

變量processDefinitionKey是在流程定義xml中設置的id。

0

流程實例是當前正在執行的流程定義的「實例」。換句話說,每次啓動一個進程時,都會創建一個進程「實例」。因此,對於任何給定的流程定義,您可能有許多「實例」,每個「實例」可能有一個更活躍的「任務」(有時是服務任務,有時是用戶任務,有時是其他等待狀態 - 例如定時器)。

在我能回答您的問題之前,我需要了解您嘗試檢索的內容。

您是否正在尋找給定流程定義的所有任務?如果是這樣,這相當於所有「實例」的所有任務。爲此,您需要查詢所有實例的流程定義,然後查詢每個實例的所有任務。

或者,你是否只查找單個實例的任務。您發佈的代碼將檢索單個實例的任務,但您需要通過查詢runtimeService查找活動實例來檢索實例id,而不是匹配您所需的查詢參數(例如業務數據,流程變量或僅由流程定義)。

希望這可以幫助,讓我們知道你正在努力實現什麼,我相信我們可以提供幫助。

問候, 格雷格