2014-07-15 11 views
0

我創建了一個執行一項特定任務的Windows Workflow 4工作流程。這些需求隨着軟件開發的變化而變化,現在工作流需要多次完成這項任務。Windows工作流中的子活動未發出跟蹤數據

我的解決方案是創建另一個工作流程,每次在集合中執行第一個工作流程。這工作正常。但是,我們的跟蹤參與者不會爲現在的子流程發佈任何記錄。

參與者仍然爲主工作流程發出數據,但它並不理想,因爲它只包含有關循環收集的信息。在執行內部工作流程時,我們可以看到詳細的輸出。

有沒有什麼我們在設置我們的跟蹤缺少?最好我不想以不同的方式構建工作流程,因爲我們可以想象,當我們開發工作流程時,我們會再次遇到這種情況,並且需要類似的解決方案。

StatusTrackingParticipant stp = new StatusTrackingParticipant 
    { 
    TrackingProfile = new TrackingProfile 
    { 
     Queries = 
     { 
     //Querying all states. 
     new ActivityStateQuery 
     { 
      ActivityName = "*", 
      States = { "*" } 
     }, 

     //querying all activty schedules ? not sure on the terminology here. 
     new ActivityScheduledQuery 
     { 
      ActivityName = "*", 
      ChildActivityName = "*" 
     }, 

     new BookmarkResumptionQuery 
     { 
      Name = "*" 
     }, 

     new CancelRequestedQuery 
     { 
      ActivityName = "*", 
      ChildActivityName = "*"    
     }, 

     new CustomTrackingQuery 
     { 
      ActivityName = "*", 
      Name = "*" 
     }, 

     new FaultPropagationQuery 
     { 
      FaultHandlerActivityName = "*", 
      FaultSourceActivityName = "*" 
     }, 

     //Querying all workflow instances ? not sure on the terminology here. 
     new WorkflowInstanceQuery 
     { 
      States = { "*" } 
     }, 
     } 
    } 
    }; 

回答

1

我所有的問題都歸結爲您使用的Tracking Profile以及它的配置方式。

你可能只對你TrackingProfile的查詢一個WorkflowInstanceQuery而這一切都制定了罰款,而工作流程,做一個特定的任務是你的主要工作流程。

既然這是主工作流程中的內部活動,您必須配置Queries以使用ActivityStateQuery來查看那些內部活動。

這樣的事情,如果你的追蹤的個人資料正在通過代碼配置:

new MyCustomTrackingParticipant 
{ 
    TrackingProfile = new TrackingProfile 
    { 
     Queries = 
     { 
      new WorkflowInstanceQuery 
      { 
       States = { WorkflowInstanceStates.Completed } 
      }, 

      // Also add this query to profile's queries 
      new ActivityStateQuery 
      { 
       States = { ActivityStates.Executing, ActivityStates.Closed } 
      } 
     } 
    } 
} 

或者通過配置:

<trackingProfile name="Sample Tracking Profile"> 
    <workflow activityDefinitionId="*"> 
     <workflowInstanceQueries> 
      <workflowInstanceQuery> 
       <states> 
        <state name="Completed"/> 
       </states> 
      </workflowInstanceQuery> 
      <activityStateQuery> 
       <states> 
        <state name="Executing"/> 
        <state name="Closed"/> 
       </states> 
      </activityStateQuery> 
     </workflowInstanceQueries> 
    </workflow> 
</trackingProfile> 

請注意,你必須積極地指定要哪個查詢和規定跟蹤,否則它們不會被默認跟蹤。如果您只想跟蹤特定活動,也可以指定活動的名稱。

編輯:

其他可能的解決方案是那些難記的一個,但最有可能您的問題在於上。查詢TrackingProfile的ImplementationVisibility屬性默認爲RootScope。將它設置爲ImplementationVisibility.All

new TrackingProfile 
{ 
    ImplementationVisibility = ImplementationVisibility.All, 
    Queries = ... 
} 

備註:

如果implementationVisibility是RootScope和複合活性 不是爲工作流程,組合活動中唯一的頂級活動 根活動被跟蹤。設置爲RootScope時,此 標誌會禁止從工作流的根目錄可看到非 的活動的跟蹤記錄。跟蹤只有根活動和其實施。如果實施包含作爲組合活動的活動 ,則會跟蹤 而不是其實施。

+0

我已將參與者的創作添加到我的問題中。當你說「你必須主動指定你想要跟蹤的查詢和狀態」這是否意味着你不能指定「*」,所有狀態?基本上我們想把所有的跟蹤信息轉儲到數據庫中以備以後處理。 –

+0

您可以使用'「*」'。你*應該*使用它,如果你想追蹤一切,當然。 – Joao

+0

好的。正如你在上面的代碼中看到的那樣,我認爲我已經設置了幾乎所有的事情。但是,我的「內在」工作流程仍然沒有排出跟蹤記錄。 –