[轉(zhuǎn)]工作流學(xué)習(xí)(1)

          我也在看powerstone workflow 的源碼,今天竟找到一個(gè)工作流牛人的心得。爽!
          轉(zhuǎn)自:http://www.guodanpi.com/zblog/post/20.html

          近幾天一直在研究工作流,網(wǎng)上的資料也非常少,大多都是淺嘗則止的要么用
          OSWorkflow做一個(gè)什么都不干的demo要么就是拼命的問sharkjBPM這類老外開發(fā)的東東,也都是問多答少,連問的問題都很淺顯,感覺研究起來頗為費(fèi)力。

              工作流提得最多的是“工作流管理聯(lián)盟(WfMC)Workflow參考模型”,沒看這個(gè)參考之前我就知道這個(gè)咚咚絕對是個(gè)超級sb,不然也不會(huì)吵吵嚷嚷這么多年都沒個(gè)霸主出來。后來找到這個(gè)sb咚咚所說到的5大接口,pdf下下來幾百頁,別說本來就不懂,就算懂一點(diǎn)看這個(gè)也能研究要頭發(fā)白,所以干脆就不管什么規(guī)范、什么接口,先看看工作流到底為什么需要,要實(shí)現(xiàn)哪些玩意才算能夠交差再說。

              中國人喜歡玩定義,所以工作流的定義那可真是五花八門,不知道寫出這些定義的bb有沒有真正開發(fā)過一個(gè)可用的工作流。看看這個(gè)感覺比較有意思http://blog.csdn.net/hongbo781202/archive/2004/09/26/117271.aspx,所以覺得他定義的是不是也能算數(shù):工作流就是為了完成同一目標(biāo)而相互銜接、自動(dòng)進(jìn)行的一系列業(yè)務(wù)活動(dòng)或任務(wù)。

              后來找到一篇介紹工作流的dbms實(shí)現(xiàn)的吹牛文章www.ict.ac.cn/xueshu/2001/061.doc,當(dāng)然多少有點(diǎn)用處,它的組織結(jié)構(gòu)、用戶、角色定義這塊按那幅數(shù)據(jù)庫設(shè)計(jì)圖來看還不錯(cuò)(打算借來改良我們現(xiàn)在的acl系統(tǒng),呵呵),其他的糟粕不說也罷。

              還是先理一理腦子里面的一些概念:(絕對是憑空設(shè)想,如果有和××規(guī)范或××實(shí)現(xiàn)相同的地方純粹巧合)

          1.   一個(gè)工作流應(yīng)該由多個(gè)狀態(tài)構(gòu)成

          既然總說工作流是“基于有限狀態(tài)機(jī)”的,“有一系列的活動(dòng)”,那么工作流在“流動(dòng)”的過程中總要有歇腳的地方,歇下來的時(shí)候給當(dāng)前的狀態(tài)拍張照就形成了一個(gè)“工作流狀態(tài)”。當(dāng)然,在真實(shí)設(shè)計(jì)的過程中,肯定是人為先定義好這些狀態(tài),由多個(gè)狀態(tài)(一個(gè)開始狀態(tài),多個(gè)中間和結(jié)束狀態(tài))構(gòu)成一個(gè)工作流定義。工作流對應(yīng)到數(shù)據(jù)庫來說除了用個(gè)id來記錄外,幾乎沒有任何必須的屬性(當(dāng)然加個(gè)name好認(rèn)誰也不攔你)。關(guān)鍵在于它的兒子(工作流狀態(tài))難定義。

          2.   工作流的狀態(tài)定義

          工作流狀態(tài)是一個(gè)靜止的概念,說白了可能就是一個(gè)字符串“通過”,“審批”等等,但是他要決定如何處理前置狀態(tài)流向它的信息。

          應(yīng)該說工作流某一狀態(tài)的入口是1…N,它的前置狀態(tài)可以有多個(gè)(當(dāng)然開始比較特殊,沒有),前置狀態(tài)經(jīng)過一定的條件后方可到達(dá)當(dāng)前的工作流狀態(tài),問題的核心不在于有多少個(gè)前置條件可以到達(dá)當(dāng)前狀態(tài),而是這些前置條件在到達(dá)時(shí)的規(guī)則,這個(gè)規(guī)則當(dāng)然是對于前置條件已經(jīng)滿足,在“匯流”到當(dāng)前狀態(tài)時(shí)會(huì)有一些處理動(dòng)作:(由于網(wǎng)上很多介紹都有一些處理的規(guī)則,但是我希望能將這些規(guī)則具體分配到是流入的動(dòng)作還是流出的動(dòng)作)

              1)對于前置條件的流入如何處理

          a.     順序:當(dāng)然是對單一的流入口來說的了,沒有什么特別

          b.     與匯聚(可能也就是oa里的會(huì)簽):詳細(xì)來說就是必須滿足所有的前置條件方能到達(dá)當(dāng)前狀態(tài),很好解釋,所有的前置條件都必須處理,所以在數(shù)據(jù)遺留(后面再說)的處理來說是最容易的。

          c.     或匯聚:相對于與匯聚,或匯聚就是只要有一個(gè)前置條件通過則可以進(jìn)入到當(dāng)前的狀態(tài)。可以考慮當(dāng)前的常任理事國的反對機(jī)制,只要一個(gè)反對,就不能通過。而或匯聚則是只要一個(gè)前置條件滿足了,就可以進(jìn)入當(dāng)前狀態(tài)。

          d.     投票:票數(shù)達(dá)到一定的百分比或數(shù)量就算通過。想想人大代表的產(chǎn)生就很容易理解投票機(jī)制。可以理解是或匯聚和與匯聚的一個(gè)補(bǔ)充。

          除了a意外,其他3個(gè)都有數(shù)據(jù)遺留的問題(呵呵,自己發(fā)明的概念):當(dāng)工作流滿足定義的處理規(guī)則進(jìn)入當(dāng)前狀態(tài)后,如何處理那些不滿足條件的前置條件的數(shù)據(jù)?舉個(gè)例子比較容易說明:

          項(xiàng)目招標(biāo),需要甲、乙、丙的三個(gè)平級領(lǐng)導(dǎo)的簽字才能通過,如下:

          甲簽字   ----|

          乙簽字   ----|   ------------------à 通過

          丙簽字   ----|

          分情況說明:

          對于與匯聚:甲通過,乙通過,但是直到丙也通過則進(jìn)入通過狀態(tài)。如果復(fù)雜一點(diǎn),丙退回的情況下,如何處理?此時(shí)甲、乙的通過情況應(yīng)該保持不變,只記錄丙的退回,然后做退回上一狀態(tài)的動(dòng)作。

          對于或匯聚:甲通過則全通過,此時(shí)需要清理乙、丙的待審批數(shù)據(jù),改變該數(shù)據(jù)的狀態(tài)。如果復(fù)雜一點(diǎn):丙退回!那么現(xiàn)在就全亂了套了,所以個(gè)人感覺,或匯聚狀態(tài)下,只要一個(gè)通過則該狀態(tài)需要鎖定,其他分支將不能再處理。

          對于投票:如果說需要2個(gè)人同意方通過,甲同意,乙同意,好說,通過。如果復(fù)雜一點(diǎn):甲通過,乙退回,丙通過!如何處理?又亂了套了,所以也是個(gè)人感覺,在投票狀態(tài)下,應(yīng)該處于鎖定狀態(tài),知道滿足通過條件或者不通過條件,方可處理。實(shí)際上這種情況非常復(fù)雜,可以采取增加優(yōu)先級的方法處理,也就是說列舉各情況的優(yōu)先級,然后按優(yōu)先級最高的處理。

          2)對于流出如何處理

          a.     條件:需要滿足一定的條件才能流出

          b.     時(shí)間:在無人處理的情況下,是否采用超時(shí)處理

          c.     還沒想到,呵呵

          3.   工作流的狀態(tài)間行為定義

          實(shí)際上記錄靜態(tài)的工作流狀態(tài)沒有意義,我們需要考慮的是記錄從哪個(gè)狀態(tài)到另一狀態(tài)的“路程”。所以在這里要定義的是我們常常用到的“箭頭”,也就是一個(gè)起點(diǎn),一個(gè)終點(diǎn)的記錄。

          唐僧經(jīng)常被問:施主從哪里來,要到哪里去?工作流狀態(tài)就是“大唐”和“西天”,狀態(tài)間行為則要回答這個(gè)問題,但是比起唐僧千篇一律的回答,狀態(tài)間行為自然要復(fù)雜得多。

          1)       解決從哪里來:

          前面已經(jīng)說明,我們要記錄的是各狀態(tài)間的“箭頭”,由于對于這個(gè)“箭頭”來說只存在唯一的起點(diǎn)和終點(diǎn)所以在數(shù)據(jù)庫的設(shè)計(jì)上,“從哪里來”的信息(定義為FromState)。

          2)       解決到哪里去:可以定義為ToState

          可以看到狀態(tài)與狀態(tài)之間是不止一種狀態(tài)間行為的。

          我們可以大致定義數(shù)據(jù)庫如下:

          class Workflow{

              Long id;

          }

          class State{

              Long id;

              Workflow workflow;

              String fromCondition;

              String toCondition;

          }

          class Route{

              Long id;

              State fromState;

              State toState;

          }

          先想這么多,明天繼續(xù)完善,呵呵(都是瞎扯啊)。

          posted on 2007-08-25 20:41 hijackwust 閱讀(446) 評論(1)  編輯  收藏

          評論

          # re: [轉(zhuǎn)]工作流學(xué)習(xí)(1) 2007-09-09 19:12 xx

          好像這個(gè)牛皮匠到現(xiàn)在還沒有設(shè)計(jì)出自己的工作流  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆檔案(57)

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 洛宁县| 太康县| 洛川县| 绥德县| 永仁县| 福清市| 原平市| 钟山县| 扎赉特旗| 宁南县| 华蓥市| 明水县| 淮安市| 阜宁县| 怀远县| 南宫市| 台中县| 海淀区| 务川| 同德县| 兴安县| 广德县| 石林| 扶沟县| 奈曼旗| 梅州市| 锡林郭勒盟| 兴山县| 西盟| 杨浦区| 万宁市| 庆城县| 徐汇区| 长汀县| 岳池县| 澄迈县| 龙陵县| 大姚县| 清河县| 牙克石市| 驻马店市|