2013-03-26 226 views
0

我有一個Activiti工作流程,其中包含一個ReceiveTask我在哪裏分組任務。我有一個Listener在ReceiveTask的事件開始處觸發,我在此檢查新添加的任務的屬性,以查看具有相同屬性的其他人是否在ReceiveTask中。如果是的話,那麼我想引發他們全部進入下一步。Trigger Activiti工作流程任務坐在ReceiveTask循環

<receiveTask id="IssuePost" name="Issue Post"> 
    <extensionElements> 
    <activiti:executionListener event="start" delegateExpression="${IssuePost}"></activiti:executionListener> 
    </extensionElements> 
</receiveTask> 

當任務移動到ReceiveTask時,我的Java偵聽器類IssuePost被調用。我可以看到其他任務列表中的ReceiveTask。我遇到了觸發任務轉移到工作流程下一步的問題。在任務中調用「signal」時,我會陷入循環。 IssuePost監聽器繼續在無限循環中觸發,直到Alfresco/Activiti放棄並拋出異常。

List<NodeRef> siblingNodes = searchService.selectNodes(parent, xpath, null, namespacePrefixResolver, false); 
if(siblingNodes.size() == batchCount) 
{ 
    for(int i=0; i < siblingNodes.size(); i++) 
    { 
     List<WorkflowInstance> workflows = workflowService.getWorkflowsForContent(siblingNodes.get(i), true); 
     // this line causes the loop. 
     workflowService.signal(workflows.get(0).getId(), null); 

我怎麼能信號在ReceiveTask的任務移動到工作流程中的下一個步驟,而不會觸發我的聽衆?只有一個流程從ReceiveTask流向工作流中的下一個步驟。

回答

1

望着InvitationServiceImpl我看到下面的有用片段:

List<WorkflowTask> tasks = workflowService.getTasksForWorkflowPath(startTask.getPath().getId()); 
    if(tasks.size()==1) 
    { 
     WorkflowTask task = tasks.get(0); 
     if(taskTypeMatches(task, taskTypes)) 
     { 
      if(properties != null) 
      { 
       workflowService.updateTask(task.getId(), properties, null, null); 
      } 
      workflowService.endTask(task.getId(), transition); 
      return; 
     } 
    } 

所以,你需要有任務本身更新或結束或者甚至開始。

或者也許在你的情況下,查找下一個啓動後的轉換,併發出一個而不是null的信號。

+0

謝謝。任何想法'endTask'實際上做了什麼? javadoc的評論有點欠缺。我不需要填寫下一個轉換,因爲當前工作流節點只有一條路徑。好像我需要在調試中運行整個Alfresco服務才能看到發生了什麼。在我看來,我試圖完成的是一項基本的操作。 – MonkeyWrench 2013-04-03 17:17:02

+0

是的,我知道,自從JBPM以來變得越來越困難。在這種情況下,你可以從執行中獲得當前的任務並結束它。 結束只是意味着完成任務(單擊下一個UI),因此在進行多次轉換時,更多地進行轉換。所以我認爲如果你實現上面的代碼,這是默認代碼,它應該工作。 – 2013-04-04 12:03:57

+0

這看起來像一個Activit交易問題。該任務在事務內部移動到工作流中的接收任務中。調用「信號」以某種方式打破了這一點。 – MonkeyWrench 2013-04-04 17:38:32

相關問題