[Develop]長時間執行的工作流程

[Develop]長時間執行的工作流程

Lab21、工作流程保留與載入

在我們撰寫應用程式過程中,一定會遇到須要長時間執行的流程。會造成長時間的情況有時不一定是程式本身有很複雜的邏輯,有時候你撰寫的程式可能要跟外部

應用程式溝通並且等待那個程式回應。例如 : 你撰寫了一個關於訂單的程式,但是要去查詢商品價錢必須要去 Oracle ERP資料庫查詢,這時你的流程就必須等待外部

的Oracle系統回應,並且你無法掌握對方的回應時間要多久。這是如果讓工作流程長駐在記憶體裡等待,那系統就可能會因為有太多的常駐等待的程式而導致整體效能

很不好。在WWF 針對這個問題提出了一個外部的服務,讓開發者將需要長時間運作的工作流程可以經由序列化後存放到 SQL Server
資料庫中,然後以一個 GUID 來對

流程做識別。爾後程式設計師可以利用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 ],這樣資料庫

建立的工作就完成了。

clip_image001

clip_image002


新增一個新的WWF專案。

接著我們新增一個 [ 循序工作流程程式庫 ] 專案,我命名他為 [Lab21_LongWorkflow ]。

clip_image003

然後在 [ 循序工作流程 ] 裡面拉出三個 [ Activity ],如下圖。2個 [ codeActivity ],1個 [ delayActivity
]。

clip_image004

我們在工作流程裡將 [ System.Windows.Forms ]加入參考,並且在工作流程程式編輯區裡面加入前置宣告 [ System.Windows.Forms
; ]。

clip_image005

clip_image006

我們點選 [ codeActivity1 ] 兩下來進入程式編輯區塊,我們撰寫右下圖的程式。讓工作流程彈出一個視窗來通知我們流程已經開始,並且顯示這個流

程的GUID。

clip_image007

clip_image008

接著我們用[ delayActivity ] 將流程暫停 30秒來模擬流程等待的動作,我們可以在這時將流程卸載。

clip_image009

clip_image010

我們點選 [ codeActivity2 ] 兩下進入程式編輯區塊,我們撰寫右下圖的程式。讓工作流程彈出一個視窗來通知我們流程已經結束,並且顯示這個流

程的GUID。

clip_image011

clip_image012

程式撰寫完畢後,我們按下鍵置。運氣好的話會看到建置成功…><。

clip_image013


加入一個新增的
Windows 應用程式專案。

加入一個新增的Windows 應用程式專案。

clip_image014

將這個專案名稱命名為 [ Lab21_LongWorkflow_WinForm ]。

clip_image015

我們在新增出來的Form裡面新增下圖的物件 。3個 [ button ] 按紐、3個 [ Lable ] 跟1個 [ TextBox ]。

clip_image016

在 Windows應用程式專案中我們加入下列的參考,並且在Windows Form中宣告前置程式碼(右下圖)。

clip_image017

clip_image018

接著把剛剛編譯好的 WWF 專案的Dll檔案加入參考。選擇加入參考中的瀏覽,找到你編譯好的WWF專案中的dll檔案。

clip_image019

進到 Windos Form 的程式編輯區域,首先我們宣告 [ 工作流程執行個體 ] 、 [ 工作流程執行時期 ] 、 [ 連線到SQL的字串
]。其中連線到資料庫的字串是要給

SQL工作流程持久服務建立資料庫連線所使用的。

clip_image020

在Window Form 上點兩下可以進入到 [ Form1_Load ]區域裡面,在 Form 被載入時我們建立工作流程執行時期實例,然後加入一個
資料庫持續服務到工作執行時期實例中

。接著啟動工作流程時期。

clip_image021

點兩下 [ 啟動一個新的工作流程 ] 按鈕,進到 [ button1_Click ] 編輯區域中。這個按鈕動作是啟動一個新的工作流程,所以我們在這邊要建立一個工作流程實例。接著

啟動這個工作流程,然後擷取工作流程的 UID 給 label 標籤。這個UID是這個工作流程的唯一識別。若要啟動一個被儲存的工作流程也是要用UID來做為識別。

clip_image022

clip_image023

點兩下 [ 卸載工作流程 ] 進到程式編輯區域。這個按鈕是用來將執行中的工作流程卸載,並且儲存到 SQL Server資料庫中。我們撰寫下圖程式,其中
Inst.Upload是用來

卸載流程。

clip_image024

clip_image025

點兩下 [ 載入工作流程 ] 進到程式編輯區域。在這邊我們要重載流程,但是儲存在資料庫的流程眾多,你要重載的流程是哪一個呢 ? 這時就必須依賴
"唯一索引" 來識別

流程,也就是剛剛說過的 UID了。所以我們借由我們在 Windows Form上的 [ TextBox ]中輸入的 UID 來啟動流程。

clip_image026

clip_image027


測試結果。

接著我們測試剛剛撰寫好的程式,執行專案後會看到如下圖的一個Windows Form。我們按下 [ 啟動一個新的工作流程 ] 按鈕,會發現畫面上彈出一個視窗並且

告訴工作流程已經開始,然後顯示了這個工作流程的 UID。

clip_image028

clip_image029

此時按下 [ 卸載工作流程 ]後,會看到一個彈出視窗來告訴你流程已經卸載。這時工作流程已經被保存到資料庫之中了(你可以來回多按幾次 [ 啟動一個新的工作流程
]

,然後再卸載工作流程。這樣就可以保留一堆工作流程到資料庫之中。因為實務上,你撰寫的應用程式可能會有許多人在使用。所以被保存到資料庫的資料可能很多。

你可以到一開始我們建立用來儲存工作流程的 [ Workflowstore ] 資料庫中的 [ InstanceState ] 資料表中撈取資料,可以看到被保留的工作流程。其中第一個欄位

[ uidInstanceID ]就是儲存用來識別工作流程的 uid。

clip_image030

clip_image031

回到 Windows Form 中,我們在 [ Textbox ]中輸入你要重載的流程的Uid。接著按下 [ 載入工作流程 ],會在畫面上跳出一個
[ 流程已重載 ] 的對話框。這樣這個流程就

成功的被重載了。

clip_image032

clip_image033

當流程執行完畢時,會彈出一個工作流程結束的對話框來通知你工作流程已經結束。並且這筆資料也會從資料庫中被刪除。

clip_image034