日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
我的微型工作流引擎設(shè)計(jì)

一、前言

    提到工作流很多人就會(huì)想到OA,的確OA就是典型的工作流的應(yīng)用,但是工作流并不僅僅局限于OA,工作流應(yīng)該算是基礎(chǔ)框架軟件,主要用于流程的重組和優(yōu) 化,它有廣闊的應(yīng)用領(lǐng)域。在java下有很多優(yōu)秀的開源工作流可以選擇比如activit5、jpbm4等,在.net下卻幾乎找不到令人滿意的工作流引 擎可用。當(dāng)然不是說.net下沒有開源的只是有些國產(chǎn)開源的但看了代碼后就一點(diǎn)興趣都沒有了,且不說代碼質(zhì)量如何,還引入了一大堆的東西,想在項(xiàng)目中應(yīng)用 也是非常困難。鑒于此我還是決定自己開發(fā)一款.NET微型工作流引擎。

二、基本說明

    為什么叫微型工作流引擎?就是超輕量級(jí),以方便在項(xiàng)目中輕便的使用,比如只有一個(gè)類庫dll,大小也就幾百k到1M左右,不過我們要先回過頭來看看工作流系統(tǒng),它實(shí)在是太大了,它應(yīng)該包括:

    1、工作流引擎     2、工作流設(shè)計(jì)器     3、工作流管理系統(tǒng)     4、表單設(shè)計(jì)器

       目前來說的我只實(shí)現(xiàn)了核心引擎,流程定義也只能先在xml中編輯然后讀取到引擎中或者直接定義到數(shù)據(jù)庫中,但整個(gè)流程是能夠正常流轉(zhuǎn)。至于流程設(shè)計(jì)器、表 單設(shè)計(jì)器、工作流管理系統(tǒng)這個(gè)我有精力了再慢慢開發(fā)。這里我完成的只是很小的一塊,但是是工作流的核心,可以很方便的嵌入到業(yè)務(wù)系統(tǒng)中應(yīng)用。

    引擎主要提供了對(duì)于工作流定義的解析以及流程流轉(zhuǎn)的支持。工作流定義文件描述了業(yè)務(wù)的交互邏輯,工作流引擎通過解析此+工作流定義文件按照業(yè)務(wù)的交互邏輯 進(jìn)行業(yè)務(wù)的流轉(zhuǎn),工作流引擎通常通過參考某種模型來進(jìn)行設(shè)計(jì),通過調(diào)度算法來進(jìn)行流程的流轉(zhuǎn)(流程的啟動(dòng)、終止、掛起、恢復(fù)等),通過各種環(huán)節(jié)調(diào)度算法來 實(shí)現(xiàn)對(duì)于環(huán)節(jié)的流轉(zhuǎn)(環(huán)節(jié)的合并、分叉、選擇、條件性的選擇等)。

三、初步印象

    1、從概念開始解釋估計(jì)大家都會(huì)看不下去了。我們先拿一個(gè)簡單實(shí)例來看看,新建一個(gè)項(xiàng)目,引用我的工作流引擎類庫(Chitu.Bpm.dll,取名為赤兔)。

在項(xiàng)目啟動(dòng)時(shí)配置流程引擎(Global.asax.cs中),如下:

 
 
  1. //初始化流程引擎
  2. BpmConfiguration
  3.     .Instance()
  4.     .Config(@"C:\Configration\BpmConfig.xml")
  5.     .Start();

在項(xiàng)目中使用時(shí),比如新建流程定義:

 
 
  1. //取得工作流上下文
  2. var bpm = new BpmContext()
  3.     .UseTransaction(true)
  4.     .SetActor("蕭秦");
  5. //新增流程定義
  6. bpm.NewProcessDefinition("請(qǐng)假流程")
  7.     .SetXmlFile(@"C:\Definition\demo1.xml")
  8.     .SetCategory("分類1")
  9.     .SetEffectDate(DateTime.Now)
  10.     .SetExpireDate(DateTime.Now.AddDays(180))
  11.     .SetMemo("memo1")
  12.     .Create()  //創(chuàng)建流程定義,只生成bpm_definition_process表
  13.     .Parse()   //解析xml
  14.     .Deploy(); //發(fā)布流程

啟動(dòng)流程:

 
 
  1. //啟動(dòng)流程
  2. var process = bpm.NewProcessIntance("請(qǐng)假流程ID", "蕭秦(業(yè)務(wù)ID)");   //創(chuàng)建流程實(shí)例
  3. process.SetVariable("流程變量1", "值1");                     //設(shè)置流程變量
  4. process.Start();

人工任務(wù)節(jié)點(diǎn)轉(zhuǎn)交下一步:

 
 
  1. //任務(wù)完成
  2. var task = bpm.LoadTaskInstance("任務(wù)ID");
  3. task.SetVariable("任務(wù)變量2", "xx");
  4. task.Signal(); //觸發(fā)令牌流轉(zhuǎn)

2、接下來我們先看看流程定義的XML,以下是我捏造的一個(gè)流程,以便把各種節(jié)點(diǎn)都放進(jìn)去了。

 
 
  1.   
  2.   
  3.     
  4.       
  5.     
  6.   
  7.   
  8.     
  9.       
  10.     
  11.   
  12.   
  13.     
  14.       
  15.       
  16.     
  17.     
  18.       
  19.       
  20.     
  21.     
  22.       
  23.     
  24.     
  25.       
  26.     
  27.   
  28.  
  29.   
  30.     
  31.     
  32.     
  33.   
  34.   
  35.     
  36.   
  37.   
  38.     
  39.   
  40.   
  41.     
  42.   
  43.   
  44.     
  45.   
  46.   
  47.     
  48.   
  49.   
  50.     
  51.   
  52.     
  53.   
  54.   
  55.     
  56.     
  57.   
  58.   
  59.     
  60.     
  61.   

定義的根節(jié)點(diǎn)為流程(process),流程下為各個(gè)任務(wù)節(jié)點(diǎn)(node),任務(wù)節(jié)點(diǎn)分為:

start       開始節(jié)點(diǎn) auto       自動(dòng)節(jié)點(diǎn) task       人工節(jié)點(diǎn) decisioin 決策節(jié)點(diǎn) fork        發(fā)散節(jié)點(diǎn) join        聚合節(jié)點(diǎn) sublfow  子流程節(jié)點(diǎn) sign       會(huì)簽節(jié)點(diǎn) wait       等待節(jié)點(diǎn) end        結(jié)束節(jié)點(diǎn)

任務(wù)節(jié)點(diǎn)下可以包括路由(transition)動(dòng)作(action)及人員分配(assignment)變量定義(variable)

其中action包括幾種類型:1、class 2、script 3、sql 4、webservice 5、expression 在script或expression中可以直接訪問process.xxx屬性或task.xxx屬性或variable.xxx簡化了動(dòng)態(tài)c#語句的使用。 當(dāng)然XML定義中還有很多其它的屬性定義我這里也沒有都列出來,以后用到了再仔細(xì)說。

3、關(guān)于數(shù)據(jù)庫設(shè)計(jì),這里僅僅是流程流轉(zhuǎn)核心所需要的表,表之間都沒有拉關(guān)系

(點(diǎn)擊圖片查看大圖)

#p#

四、部分功能剖析

 a、我把它劃分為主要的幾大模塊: 引擎配置、流程定義、實(shí)例流轉(zhuǎn)、日志處理、計(jì)劃任務(wù)

引擎配置:配置引擎實(shí)例的數(shù)據(jù)庫連接、日志配置、參數(shù)設(shè)定等。         流程定義:利用xml來描述流程,主要定義任務(wù)節(jié)點(diǎn),路由、動(dòng)作事件、變量、人員分配等         實(shí)例流轉(zhuǎn):根據(jù)定義運(yùn)行流程實(shí)例         日志處理:輸出日志         任務(wù)計(jì)劃:會(huì)啟動(dòng)一個(gè)服務(wù),用于處理比如延時(shí)啟動(dòng),任務(wù)過期等

b、流轉(zhuǎn)中的關(guān)鍵性類設(shè)計(jì)包括:

1、流程對(duì)象(Process)         2、工作任務(wù)(Task)         3、路由(Trasition)         4、令牌(Token)         5、事件總線與動(dòng)作處理 (EventBus、ActionHandler)         6、人員分配及委托機(jī)制(Assignment、Depute)         7、流程回退處理(RollbackService)         8、消息服務(wù)(NotifyService)

 c、通常引擎控制流程調(diào)度流轉(zhuǎn)核心的調(diào)度算法主要有FSM以及PetriNet兩種,基于調(diào)度算法來完成流程的流轉(zhuǎn):

1、FSM(有限狀態(tài)機(jī))         FSM 的定義為包含一組狀態(tài)集(states)、一個(gè)起始狀態(tài)(start state)、一組輸入符號(hào)集(alphabet)、一個(gè)映射輸入符號(hào)和當(dāng)前狀態(tài)到下一狀態(tài)的轉(zhuǎn)換函數(shù)(transition function)的計(jì)算模型。當(dāng)輸入符號(hào)串,模型隨即進(jìn)入起始狀態(tài)。它要改變到新的狀態(tài),依賴于轉(zhuǎn)換函數(shù)。在有限狀態(tài)機(jī)中,會(huì)有有許多變量,例如,狀態(tài) 機(jī)有很多與動(dòng)作(actions)轉(zhuǎn)換(Mealy機(jī))或狀態(tài)(摩爾機(jī))關(guān)聯(lián)的動(dòng)作,多重起始狀態(tài),基于沒有輸入符號(hào)的轉(zhuǎn)換,或者指定符號(hào)和狀態(tài)(非定有 限狀態(tài)機(jī))的多個(gè)轉(zhuǎn)換,指派給接收狀態(tài)(識(shí)別者)的一個(gè)或多個(gè)狀態(tài),等等。遵循FSM流程引擎通過狀態(tài)的切換來完成流程的流轉(zhuǎn)。         2、PetriNet         信息流的一個(gè)抽象的、形式的模型。指出一系統(tǒng)的靜態(tài)和動(dòng)態(tài)性質(zhì)。PetriNet通常表示成圖。遵循PetriNet流程引擎通過令牌來決定流程的流轉(zhuǎn)。         我采用的是第二種PetriNet算法。用Token來表示當(dāng)前實(shí)例運(yùn)行的位置,也利用token在流程各個(gè)點(diǎn)之間的轉(zhuǎn)移來表示流程的推進(jìn),如下圖所示:

 

令牌流轉(zhuǎn)邏輯,我把以下類方法都做一個(gè)簡化省略了路由選擇及節(jié)點(diǎn)處理細(xì)節(jié),好讓大家明白令牌的流轉(zhuǎn):

 
 
  1. //令牌Token類中Signal
  2. public void Signal() 
  3. {
  4.     fromTask.Leave(executeContext);
  5. }
  6. //任務(wù)Task類中的Leave
  7. public void Leave(ExecutionContext executionContext)
  8. {
  9.     transition.Take(executionContext);
  10. }
  11. //路由Transition類中的Take
  12. public void Take(ExecutionContext executionContext)
  13. {
  14.     toTask.Enter(executionContext);
  15. }
  16. //任務(wù)Task類中的Enter
  17. public void Enter(ExecutionContext executionContext)
  18. {
  19.     Run(executionContext);
  20. }

至此令牌成功的從一個(gè)節(jié)點(diǎn)轉(zhuǎn)移到下一個(gè)節(jié)點(diǎn)了,令牌的流轉(zhuǎn)是工作流的關(guān)鍵,當(dāng)然不同的節(jié)點(diǎn)處理是有所不同的,其中最復(fù)雜的當(dāng)數(shù)發(fā)散節(jié)點(diǎn)及聚合節(jié)點(diǎn)了。這里就介紹到這里,不再給大家詳細(xì)介紹了。

d、目前我引擎中實(shí)現(xiàn)的主要包括以下功能:

1、解釋過程定義     2、控制過程實(shí)例—?jiǎng)?chuàng)建、激活、掛起、終止等     3、控制流程調(diào)度流轉(zhuǎn)     4、自定義動(dòng)作及事件發(fā)布     5、流程變量及工作變量處理     6、任務(wù)計(jì)劃,比如延時(shí)啟動(dòng),任務(wù)過期等     7、委托服務(wù),委托代辦     8、回退服務(wù),回退到任意節(jié)點(diǎn)或召回     9、消息服務(wù),比如認(rèn)領(lǐng)通知、待辦提醒、催辦消息…     10、流程任務(wù)監(jiān)控服務(wù)     11、日志處理及歷史記錄     12、任務(wù)分配與認(rèn)領(lǐng)           13、參與者組織模型接口

五、總結(jié)

目前我的這款工作流引擎還在繼續(xù)完善當(dāng)中,我總結(jié)下它的優(yōu)缺點(diǎn):

優(yōu)點(diǎn): 1、它是一款超輕量極或者說是微型的工作流引擎,而且綠色無污染,它只有一個(gè)dll,大小僅1M左右。 2、它目前支持SQL Server、MySql、Oracle、SQLite、PostgreSql等多種數(shù)據(jù)庫 3、體型上來說它雖然是微型,但功能上并不算微型,它的設(shè)計(jì)結(jié)合了現(xiàn)代的OA及傳統(tǒng)工作流、基本上可以實(shí)現(xiàn)我們大多數(shù)的功能需要。 4、它其實(shí)是面向開發(fā)者設(shè)計(jì)的,從上面初始印象中的實(shí)例代碼中大家可以看到,它的接口是很集中、精簡、友好的,讓開發(fā)者容易理解而且使用起來更方便簡單。所以它更適合嵌入到項(xiàng)目中開發(fā)。 缺點(diǎn): 1、它現(xiàn)在沒有流程設(shè)計(jì)器、管理系統(tǒng)、表單設(shè)計(jì)器等,充其量只能算是一個(gè)類庫,并不是直接拿來就可以使用。 2、目前剛剛完成第一個(gè)內(nèi)部版本,而且目前只在我們內(nèi)部項(xiàng)目中使用,所以它不夠成熟,雖然我們會(huì)持續(xù)的改進(jìn)和完善。 3、缺乏成功應(yīng)用的案例。 對(duì)于我們自己來說,這些缺點(diǎn)都是我們需要繼續(xù)努力的地方,可能還需要大量的時(shí)間來完成。目前來說我們還不打算開源,等它慢慢穩(wěn)定成熟后我們會(huì) 考慮是不是開源出來。如果大家有好的建議或有哪方面的疑惑我很樂意給大家解答,或者你也在設(shè)計(jì)開發(fā)自己的工作流,我們可以相互交流下。


文章名稱:我的微型工作流引擎設(shè)計(jì)
分享鏈接:http://www.dlmjj.cn/article/djpdooe.html