2010-03-29 37 views
3

我需要編寫一個監視對象狀態的工作流程。 (這可能等待數天或數小時的狀態改變)幫助處理監視對象狀態的自定義工作流程

我有對象以下狀態(可以稱之爲一個發行對象):

1) Created 
2) Unowned 
3) Owned 
4) UnAssigned 
5) Assigned 
6) In Progress 
7) Signed Off 
8) Closed 

我還需要採取一些行動在一個對象上,如果對象在一定的時間內處於特定的狀態(不確定如何實現這一點)。

該對象的所有者/受讓人可以隨時更改(即從進行中轉移到未開啓),所以我猜測狀態機圖是我需要使用的。 如果我的想法不正確,請讓我知道。

我的應用程序是用c#.net 3.5編寫的。

我在想有一種名爲CreateIssue的服務方法,它將插入票據到數據庫,然後開始一個工作流的實例(以對象或對象的ID作爲參數)。 我不確定工作流將如何知道特定對象何時被更新,或者對象的狀態是否已更改。我已經做了一些非常簡單的「hello world」類型的應用程序與Windows工作流基礎3.5,但還沒有掌握如何去執行這樣的事情。

對此的任何方向都會非常有幫助。

在此先感謝。

回答

1

基本的方法是創建一個WorkflowService,它定期檢查數據庫並排隊發送所需更改的消息。 worklfow活動告訴服務開始執行時正在等待的內容以及它正在監聽的隊列。該活動在收到所需消息時關閉。

+0

該工作流程將如何啓動/啓動? – AlteredConcept 2010-03-30 00:08:33

+0

啊,我的印象是你已經有了一個正在運行的工作流程。在新工作表的情況下,你需要做的就是使用WorkflowRuntime來啓動它,通過輸入字典傳遞你想要的數據, – Maurice 2010-03-30 06:31:17

+0

我已經修改了我的原始文章,並詳細說明了我想要完成的工作。 – zSynopsis 2010-03-31 03:03:04

1

沒有機制內WF到直接當一個對象已經改變自動檢測 - 這讓你有三個選擇:

  1. 掛起的工作流程,並利用外部代碼來恢復它當外部對象改變狀態。
  2. 在工作流程內,在While結構中添加一個Delay活動,該活動定期檢查被監視的對象是否有變化。
  3. 在對象狀態發生變化時觸發的對象上發佈事件。

選項1和選項2依賴於輪詢機制 - 在一種情況下在工作流之外實現,在其他情況下實現在其中。選項3使用包含事件的主題/觀察者模式在發生更改時通知工作流程。

選項3使用WF EventDrivenActivity - see the MSDN documentation here或有點wiki article about it here相對容易實現。從這個觀點來看,這個選項也是可取的,如果對象上存在一系列狀態轉換,則會通知工作流程其中的每一個 - 而輪詢模型只能選取最後一個(或輪詢發生時發生的任何一個) 。

如果您無法訪問正在監視的對象的代碼和/或無法更改對象的行爲,則選項1和2是有意義的。在這些情況下,投票幾乎是您唯一的選擇。

要在1和2之間進行選擇,您需要確定有多少個同步工作流程可能都會等待狀態更改。當工作流可以掛起並寫入持久性存儲區時,WF可以很好地擴展 - 當數百(或數千)個活動工作流必須全部在內存中同時活動時,WF的擴展能力會更低。如果您只希望有幾個長時間運行的工作流程等待發生此類監控的更改,則可以繼續並執行選項2(使用工作流延遲活動)。如果你期望有很多這樣的工作流程,你最好在一個單獨的線程中執行監控,並暫停工作流程,直到有一些工作要做。

如果您確實使用了選項2,請確保爲工作流設計了一個替代路徑(超時,通知,狀態等),以避免離開不會終止但繼續消耗的孤立活動工作流資源。