日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
我的微型工作流引擎設計

一、前言

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

二、基本說明

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

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

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

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

三、初步印象

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

在項目啟動時配置流程引擎(Global.asax.cs中),如下:

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

在項目中使用時,比如新建流程定義:

 
 
  1. //取得工作流上下文
  2. var bpm = new BpmContext()
  3.     .UseTransaction(true)
  4.     .SetActor("蕭秦");
  5. //新增流程定義
  6. bpm.NewProcessDefinition("請假流程")
  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ā)布流程

啟動流程:

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

人工任務節(jié)點轉交下一步:

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

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

 
 
  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é)點為流程(process),流程下為各個任務節(jié)點(node),任務節(jié)點分為:

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

任務節(jié)點下可以包括路由(transition)動作(action)及人員分配(assignment)變量定義(variable)

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

3、關于數據庫設計,這里僅僅是流程流轉核心所需要的表,表之間都沒有拉關系

(點擊圖片查看大圖)

#p#

四、部分功能剖析

 a、我把它劃分為主要的幾大模塊: 引擎配置、流程定義、實例流轉、日志處理、計劃任務

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

b、流轉中的關鍵性類設計包括:

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

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

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

 

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

 
 
  1. //令牌Token類中Signal
  2. public void Signal() 
  3. {
  4.     fromTask.Leave(executeContext);
  5. }
  6. //任務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. //任務Task類中的Enter
  17. public void Enter(ExecutionContext executionContext)
  18. {
  19.     Run(executionContext);
  20. }

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

d、目前我引擎中實現的主要包括以下功能:

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

五、總結

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

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


當前題目:我的微型工作流引擎設計
文章位置:http://m.5511xx.com/article/djpdooe.html