2011-12-09 87 views
0

我有一個主要由相同元素組成的工作流程。
每個元素的定義如下:當所有工作流程序列都空閒時檢測

Workflow element

工作流可以簡單地堆疊在一個序列中這些元件,它可以並行運行它們,它可能已經在它們之間分支等 - 完全自由的工作流設計師整個事情是作爲一個WCF服務託管的,但如果可能的話,我寧願不要依賴它。

這整個設置的高層次的想法是這樣的:

  1. 當工作流啓動時,這些元素開始射擊了,此起彼伏,迅速跳過上面條件分支。前一個元素的完成會導致下一個元素的開始 - 如工作流中所定義。
  2. 在某些情況下,當條件[B]正確時,元素可能會佔用底部分支並等待WCF調用。
  3. 遲早或者所有元素都會停止,或者工作流完全結束。

我需要的是當所有元素停止等待WCF調用時捕捉那一刻。

在這一點上,我需要執行一些計算,這些計算會影響進一步的工作流程。因此,我需要準確地捕捉那一刻。

一些注意事項:

  1. 我保證不會WCF調用會來之前我做這些計算。因此,與WCF調用相關的可能的競爭條件超出了範圍。
  2. 我沒有控制流量的應用程序。換句話說,我在IIS中託管,因此可能會在不通知的情況下重新啓動,並且無法設置定時器,長時間運行的循環,消息泵等。
  3. 我不控制工作流程的設計。
  4. 但是,我完全控制元素的設計。事實上,這個元素實際上是一個NativeActivity(這就是爲什麼該圖來自Visio :-),我控制的源代碼。
  5. 我也在某種程度上控制主機環境。也就是說,我可以對工作流託管的Web應用程序進行修改。
  6. 整個工作流「附加」到業務對象,並且所有元素都有權訪問它。

回答

0

最好的方法是創建一個TrackingParticipant擴展。該擴展將接收Track方法中的所有跟蹤記錄。然後,當它收到WorkflowInstanceStateRecord並且狀態爲「空閒」時,您將知道工作流程處於空閒狀態。活動可以訪問這個擴展來接收來自它的數據或者調用它的方法。

這是我在Introduction to State Machine Hands On Lab

+0

中使用的技術謝謝你領先。然而。我沒有看到名爲'WorkflowInstanceStateRecord'的類。 TrackingParticipant的第一個參數。Track'方法是'TrackingRecord',它沒有名爲'State'的屬性或類似的屬性。我也看不到一個服務定位器,它允許我訪問工作流主機並通過ID獲取工作流實例。任何幫助? –

+0

啊,明白了!它是'WorkflowInstanceRecord',裏面沒有「State」。現在找到它。當我在挖掘的時候堅持下去...... –

+0

好的,所以我可以跟蹤跟蹤參與者的沉默時刻,這很有效。但是現在我發現自己無法從該參與者中獲取關聯的業務對象。我的活動從註冊爲工作流程擴展的DI容器中獲取存儲庫。活動可以通過它們的'NativeActivityContext'到達DI容器。但參與者呢? –