[Develop]長時間執行的工作流程
Lab21、工作流程保留與載入 |
在我們撰寫應用程式過程中,一定會遇到須要長時間執行的流程。會造成長時間的情況有時不一定是程式本身有很複雜的邏輯,有時候你撰寫的程式可能要跟外部 應用程式溝通並且等待那個程式回應。例如 : 你撰寫了一個關於訂單的程式,但是要去查詢商品價錢必須要去 Oracle ERP資料庫查詢,這時你的流程就必須等待外部 的Oracle系統回應,並且你無法掌握對方的回應時間要多久。這是如果讓工作流程長駐在記憶體裡等待,那系統就可能會因為有太多的常駐等待的程式而導致整體效能 很不好。在WWF 針對這個問題提出了一個外部的服務,讓開發者將需要長時間運作的工作流程可以經由序列化後存放到 SQL Server 流程做識別。爾後程式設計師可以利用GUID從資料庫取出指定的流程,在繼續流程的進行。 也或者是你設計了一個有關於簽核流程的應用程式,當簽核流程進行到下 一個節點時,下一關的簽核人並不一定會馬上籤核;有可能簽核人不在座位上或是其他原因耽擱了。像這樣的流程就可以被保留到資料庫中,等待下一關簽核人真正 要簽核時,再讓流程繼續。 |
建立SQL儲存流程序列化資料的資料庫與資料表。
在保存工作流程資料之前,無庸置疑的我們需要先建立保存資料的資料庫。首先我們在SQL Server 中建立一個 [ Workflowstore
] 的資料庫,這個資料庫的命名你也可以
隨自己的Rule來自訂。接著要在這個資料庫中建立儲存工作流程的資料表。建立這個資料表要運用 .Net FrameWork 3.0 所提供的
SQL Script 來建立。
在 [ C:\WINDOWS\Microsoft.Net\FrameWork\v3.0\Windows Workflow Foundation\SQL\ZH-CHT
]下有兩個SQL Script,分別是 [ SqlPersistenceService_Logic.sql ]、
[ SqlPersistenceService_Schema.sql ]。將這兩個 Script 在你的資料庫執行後,會看到你的資料庫多了兩個資料表;分別為
[ CompletedScope ]、[ InstanceState ],這樣資料庫
建立的工作就完成了。
新增一個新的WWF專案。
接著我們新增一個 [ 循序工作流程程式庫 ] 專案,我命名他為 [Lab21_LongWorkflow ]。
然後在 [ 循序工作流程 ] 裡面拉出三個 [ Activity ],如下圖。2個 [ codeActivity ],1個 [ delayActivity
]。
我們在工作流程裡將 [ System.Windows.Forms ]加入參考,並且在工作流程程式編輯區裡面加入前置宣告 [ System.Windows.Forms
; ]。
我們點選 [ codeActivity1 ] 兩下來進入程式編輯區塊,我們撰寫右下圖的程式。讓工作流程彈出一個視窗來通知我們流程已經開始,並且顯示這個流
程的GUID。
接著我們用[ delayActivity ] 將流程暫停 30秒來模擬流程等待的動作,我們可以在這時將流程卸載。
我們點選 [ codeActivity2 ] 兩下進入程式編輯區塊,我們撰寫右下圖的程式。讓工作流程彈出一個視窗來通知我們流程已經結束,並且顯示這個流
程的GUID。
程式撰寫完畢後,我們按下鍵置。運氣好的話會看到建置成功…><。
加入一個新增的
Windows 應用程式專案。
加入一個新增的Windows 應用程式專案。
將這個專案名稱命名為 [ Lab21_LongWorkflow_WinForm ]。
我們在新增出來的Form裡面新增下圖的物件 。3個 [ button ] 按紐、3個 [ Lable ] 跟1個 [ TextBox ]。
在 Windows應用程式專案中我們加入下列的參考,並且在Windows Form中宣告前置程式碼(右下圖)。
接著把剛剛編譯好的 WWF 專案的Dll檔案加入參考。選擇加入參考中的瀏覽,找到你編譯好的WWF專案中的dll檔案。
進到 Windos Form 的程式編輯區域,首先我們宣告 [ 工作流程執行個體 ] 、 [ 工作流程執行時期 ] 、 [ 連線到SQL的字串
]。其中連線到資料庫的字串是要給
SQL工作流程持久服務建立資料庫連線所使用的。
在Window Form 上點兩下可以進入到 [ Form1_Load ]區域裡面,在 Form 被載入時我們建立工作流程執行時期實例,然後加入一個
資料庫持續服務到工作執行時期實例中
。接著啟動工作流程時期。
點兩下 [ 啟動一個新的工作流程 ] 按鈕,進到 [ button1_Click ] 編輯區域中。這個按鈕動作是啟動一個新的工作流程,所以我們在這邊要建立一個工作流程實例。接著
啟動這個工作流程,然後擷取工作流程的 UID 給 label 標籤。這個UID是這個工作流程的唯一識別。若要啟動一個被儲存的工作流程也是要用UID來做為識別。
點兩下 [ 卸載工作流程 ] 進到程式編輯區域。這個按鈕是用來將執行中的工作流程卸載,並且儲存到 SQL Server資料庫中。我們撰寫下圖程式,其中
Inst.Upload是用來
卸載流程。
點兩下 [ 載入工作流程 ] 進到程式編輯區域。在這邊我們要重載流程,但是儲存在資料庫的流程眾多,你要重載的流程是哪一個呢 ? 這時就必須依賴
"唯一索引" 來識別
流程,也就是剛剛說過的 UID了。所以我們借由我們在 Windows Form上的 [ TextBox ]中輸入的 UID 來啟動流程。
測試結果。
接著我們測試剛剛撰寫好的程式,執行專案後會看到如下圖的一個Windows Form。我們按下 [ 啟動一個新的工作流程 ] 按鈕,會發現畫面上彈出一個視窗並且
告訴工作流程已經開始,然後顯示了這個工作流程的 UID。
此時按下 [ 卸載工作流程 ]後,會看到一個彈出視窗來告訴你流程已經卸載。這時工作流程已經被保存到資料庫之中了(你可以來回多按幾次 [ 啟動一個新的工作流程
]
,然後再卸載工作流程。這樣就可以保留一堆工作流程到資料庫之中。因為實務上,你撰寫的應用程式可能會有許多人在使用。所以被保存到資料庫的資料可能很多。
你可以到一開始我們建立用來儲存工作流程的 [ Workflowstore ] 資料庫中的 [ InstanceState ] 資料表中撈取資料,可以看到被保留的工作流程。其中第一個欄位
[ uidInstanceID ]就是儲存用來識別工作流程的 uid。
回到 Windows Form 中,我們在 [ Textbox ]中輸入你要重載的流程的Uid。接著按下 [ 載入工作流程 ],會在畫面上跳出一個
[ 流程已重載 ] 的對話框。這樣這個流程就
成功的被重載了。
當流程執行完畢時,會彈出一個工作流程結束的對話框來通知你工作流程已經結束。並且這筆資料也會從資料庫中被刪除。