WF持久化機制剖析

2022-03-21 18:56:57 字數 2151 閱讀 5248

1 為什麼要持久化狀態?

1.1

記憶體是有限的,將等待或者休眠的流程暫時從記憶體中解除安裝有利於提供效能

1.2

執行時可能會出現不穩定因素導致流程崩潰,持久化可以提供流程恢復的可能

1.3

流程中的事務或者補償機制需要隔離的流程狀態來輔助完成

2

什麼時候會發生流程被持久化?

2.1

在流程中加入的活動被標有

persistonclose

屬性,這是人為設定的強制持久化策略,

即流程執行到該步驟必須要儲存一下,不表示從內從中解除安裝。

2.2

活動的執行時狀態被設定為

executing

時(即執行中)(如果

delayactivity

),下乙個活動必須在將來的某個時候到達,

這時引擎會決定使流程進行持久化。

2.3

當在流程例項之外手動呼叫解除安裝流程的方法時會導致持久化

2.4

當具有補償特性的活動(如

compensatablesequenceactivity)

被建立多於乙個執行上下文時會發生持久化(請原諒這話說的有點專業,因為解釋它需要費長篇大論)

3

什麼時候會發生流程被反持久化?

流程被儲存後是不具有自我啟用的功能的,必須通過外部方法去啟用它。

3.1

當呼叫引擎的獲取乙個工作流例項的方法時,

如果例項不在記憶體中,引擎會自動向已註冊的持久化服務發出裝載其狀態的指令

4

什麼是流程阻塞態?

4.1

在流程執行過程中,當遇到例如

delay

這樣的活動時,流程被指示進入休眠狀態(鈍化)

,即被掛起,

此時流程根活動被標記為阻塞態,引擎發出持久化指令。

4.2

什麼時候出現非阻塞態持久化化行為?

4.2.1

手動呼叫持久化或者設定持久化點(

persistoncloseattribute

)的時候

5 什麼是流程鎖定態?

5.1

當流程執行從事務範圍(

transacationscope

)退出或結束了乙個具有持久點標記的活動時,

引擎自動持久化該流程狀態,此時流程被標記為鎖定態,即獨佔的。

5.2

為什麼需要這個狀態?

5.2.1

因為流程例項有可能被多個

host

載入,如果沒有這個狀態表示,

當出現上述情況時,使開發者可以根據自己的設計要求去做排他操作,這樣流程狀態會發生紊亂,或破壞區域性流程的原子操作。

6

如何喚醒流程?

6.1

流程被持久化以後就變成了資料,而不具有任何行為,所以它不具有自我喚醒的功能

6.2

流程可以通過定時器輪詢喚醒

6.3

當要獲取指定的流程例項而該流程不在記憶體中時,流程會引擎喚醒

6.4

可以通過從流程的根活動獲取下乙個執行週期的時間點,並定時喚醒該流程

7

流程與訊息佇列

7.1

流程是怎麼被驅動的?

7.1.1

流程是依靠引擎自帶的執行計畫服務驅動的

7.2

執行計畫中的計畫項是依靠什麼實現的?

7.2.1

依靠引擎自帶的訊息佇列服務完成的

7.3

為什麼訊息佇列服務只能從活動的執行上下文(

aec)中獲得?

7.3.1

因為訊息佇列服務不同於其它服務,它是負責驅動流程往下走的機制之一,它必須和流程繫結。

當流程被持久化後必須攜帶訊息佇列服務的全部資訊。否則,當出現

runtime host

更換時,流程不能被正常驅動,這樣就失去了流程持久化的意義,也完成不了群集

host

的需求。

WF4之持久化

wf4我已經學了好幾遍了,但一直沒有用到。最後又忘了。這次來研究一下wf4的持久化。第一,初始化wf4依賴的幾個表 儲存過程,在路徑 c windows microsoft.net framework v4.0.30319 sql zh hans下可以找到6個檔案,先後執行即可 第二 幾個重要的類,...

持久化機制

redis是乙個支援持久化的記憶體資料庫,也就說redis需要經常將記憶體中的資料同步到硬碟來保證持久化 redis支援兩種持久化方式 1.snapshotting 快照 也是預設方式 將資料存以快照的方式寫入到二進位制檔案中 預設檔名dump.rdb可以通過配置設定自動做快照持久化的方式。我們可以...

sparkStreaming持久化機制

對於基於視窗的操作,比如reducebywindow reducebykeyandwindow,以及基於狀態的操作,比如updatestatebykey,預設就隱式開啟了持久化機制。即spark streaming預設就會將上述操作產生的dstream中的資料快取到記憶體長,不需要開發人員手動呼叫p...