基本wwf
的研究已經有一段時間了,在
windows sdk documentation
中的有關
wwf的資料也看了個差不多。現在理論上的東西基本上沒有什麼問題,那麼問題就在於如何去應用了。從網上查了一下,這方面的案例很少,也許非
wwf的其它工作流引擎的應用可能會多一些,但我沒有去查。為此我自己進行了一些探索,也不知摸索的對不對,但自己感覺能夠走的通,所以寫下此文。可能會存在一些彎路,還望有識之士給以點評。這裡以順序工作流進行說明。
首選是持久化與鎖定問題及
delayactivity
過期執行的問題:
借助於wwf提供的設計器我們可以輕鬆的設計出乙個工作流,並使之能夠執行。如果活動由同乙個程序來參與這是沒有問題的,但工作流可能需要多個人的參與,這就需要將工作流進行持久化了。持久化要考慮的事情很多,如持久化的儲存,鎖定,及對
delayactivity
的影響等等。
wwf提供了workflowpersistenceservice
和sqlworkflowpersistenceservice
兩個類來實現持久化。但
workflowpersistenceservice
是乙個抽象類,需要自己去實現,網上有和
sdk中有有關檔案持久化的實現,但不是乙個完整的實現。
sqlworkflowpersistenceservice
是乙個持久化到資料庫的完整實現,不過只能用於
sql server
。為了能夠使用
sqlworkflowpersistenceservice
,資料庫還需要啟動
dtc服務。
我曾經對
sqlworkflowpersistenceservice
的鎖定機制存在疑慮。在
sdk中我有這樣的理解,如果工作流引擎載入工作流例項時,如果載入成功它會鎖定,這樣其它引擎就不能載入這個工作流例項了。當工作流例項儲存回資料庫後便解除鎖定狀態,這樣其它引擎便可載入該工作流例項了。我假設了一種情況,當載入工作流例項的程序突然死掉(如掉電),則資料庫的鎖定狀態是不是永遠都不能解鎖了。對此我進行了研究,在
sqlworkflowpersistenceservice
的建構函式中有乙個引數
instanceownershipduration
,這個引數的意義是什麼?
sdk中沒有直接給出乙個詳細的說明,但卻在其它地方隱含的說明了
(並沒有提及到
instanceownershipduration
這個引數名
)。根據我的理解此引數它實際上指明了鎖定工作流例項的時間限制。我們依據現實情況去估計乙個工作流例項在某乙個環節處理所用的時間進行設定,如
10分鐘。如果處理時間超過這個值則會被其它引擎自動解鎖,也就是說解鎖可以由其它引擎來進行而不依賴於當前的程序。這是如何實現的呢?
我看了一下服務於
sqlworkflowpersistenceservice
的資料庫
workflowpersistencestore
,裡面有一張表
instancestate
,這個表裡記錄著工作流的例項,其中有乙個
owneduntil
字段,它記錄了該工作流例項鎖定的到期時間,當引擎載入乙個工作流例項時,它會將當前時間加上
sqlworkflowpersistenceservice
建構函式中的
instanceownershipduration
引數指定的時間,並把相加的時間存放到
owneduntil
欄位裡。同時資料庫裡還有乙個儲存過程
unlockinstancestate
,其它的工作流引擎就是用此儲存過程來解鎖被鎖定的工作流例項。這個過程是引擎自動完成的,我們所要做的就是載入乙個我們需要的工作流。
我們再來看一下
delayactivity
,這是乙個提供延時處理的活動。假設一下,當乙個活動處理於
idle
狀態,並且工作流例項的
unloadonidle
被置位。那麼我們就需要延時到達後
(注意這個「後」字,即延時過後什麼時間載入都是可以的。
)提供工作流例項繼續執行的方法。
sdk中有乙個有關自定義持久化服務的乙個例子,它對該功能進行了描述,但它沒有考慮工作流例項被不同的程序進行處理時的延時修正問題。
sqlworkflowpersistenceservice
為我們提供了所有的這一切:在
instancestate
表中有乙個
nexttime
字段,便是用於修正延時時間用的。
sqlworkflowpersistenceservice
的建構函式中還有乙個引數
loadinginterval
,此引數可以使引擎在多少時間間隔內去檢測那些超時的工作流例項,如果超時了則自動進行載入並執行。
請注意instanceownershipduration
和loadinginterval
引數的使用,否則可能會出現你不希望發生的情況!當
instanceownershipduration
和loadinginterval
的值設的足夠小,如將
instanceownershipduration
的值設為0,
loadinginterval
的值設為
1,則乙個超時的工作流例項可能被多個工作流引擎同時載入……。因為每個載入者在進行載入的時候都不進行鎖定,所以會發生這樣的情況。切記!
sqlworkflowpersistenceservice
一般情況下在工作流例項執行完成後將其自動從資料庫中進行刪除以釋
放占用的空間。但當程序非正常退出時可能會將資料庫的工作流例項的
nexttime
欄位的值設為最大值,即永遠都不會再次被載入,當然也不會消除所占用的空間,這種情況發生的概率很小(這是我偶然發現的,當工作流例項完成,但還沒有進行清除時便結束工作流的執行就會發生這樣的情況!)。
rehosting wwf designer 之定製活動的外觀
rehosting wwf designerp之從工具箱拖動活動到設計器上
rehosting wwf 設計器
WWF的一些技術細節與應用體會(一)
基本wwf 的研究已經有一段時間了,在 windows sdk documentation 中的有關 wwf的資料也看了個差不多。現在理論上的東西基本上沒有什麼問題,那麼問題就在於如何去應用了。從網上查了一下,這方面的案例很少,也許非 wwf的其它工作流引擎的應用可能會多一些,但我沒有去查。為此我自...
WF的一些技術細節與應用體會(三)
有關 handleexternalevent 的一些事情。有乙個很有趣的現象,是望星觀月發現的。情況大體是這樣的,當乙個工作流設計中含有乙個 handleexternalevent 活動時,在其執行到該活動後,如果沒有觸發乙個相關的事件,則該活動會被持久化的。這裡使用的持久化是 sqlworkflo...
RPC封裝需要注意的一些技術細節
rpc remote procedure call,即遠端過程呼叫 是建立在socket之上的,在一台機器上執行的主程式,可以呼叫另一台機器上準備好的子程式,就像lpc 本地過程呼叫 也就是說兩台伺服器a,b,乙個應用部署在a伺服器上,想要呼叫b伺服器上應用提供的函式 方法,由於不在乙個記憶體空間,...