業務流程引擎

2021-09-02 11:22:49 字數 4977 閱讀 1447

一般的時候,我們都採用程式設計式開發,程式設計式開發的好處非常明顯:直接、高效、自由,當然其缺點也是有的,與其優點剛好相對,因為直接,所以有些變化都要進行**上的修改;因為高效,所以一旦出問題,導致的結果也比較嚴重,因為自由,所以帶來的修改風險也比較大。這也就是許多大的公司都在進行流程化開發的重要原因之一,比如:上海普元,livebos, justep,還有許許多多知名不知名的公司都有類似的流程化開發引擎存在,通過流程化開發,增強**的復用性,降低軟體開發成本及測試成本,提公升軟體的可維護性及降低維護成本。

tiny框架在這方面也有自己的方案,tiny主要考慮幾個方面的問題:

a.元件擴充的便捷性

元件的擴充的便捷性是指,流程其實玩的就是元件,如果元件擴充起來非常困難,會直接影響到流程引擎的可用性。所以tiny框架的流程引擎的元件結構非常之簡單,僅有乙個介面方法;流程元件的註冊與載入也是非常重要的,如果在擴充流程元件的時候,需要複雜的註冊或配置過程,這個時候流程擴充的便捷性也會大大降低。tiny框架採用了引用即註冊的方案,只要把流程元件放入系統執行環境之間,就完成了流程元件的註冊,即可以在流程中使用,便得流程元件的擴充的便捷性大大提高。

b.流程的物件導向特性支援

流程的面向特性支援是指在tiny框架中流程是具有物件導向的特性的。流程可以進行繼承,這樣帶來乙個好處就是多個流程中重複的部分,可以定義在乙個父流程中,然後子流程只要繼承父流程,即可;流程節點是可以被覆蓋的,也就是說,在父流程中可以定義乙個空節點,但是流程中定義了流轉關係,但是流程節點的實現留在子流程中實現;

c.流程的易編輯性

流程的編輯必須方便、容易,有專門的流程編輯工具更好,沒有的時候,使用普通的xml編輯器也可以方便的進行編輯。

d.流程的可重入性

一般的流程引擎都是不可重入的,也就是只能從開始執行,執行到結束結點之後完成。tiny流程引擎支援流程重入,也就是說,不一定是從開始結點執行,可以從任意乙個結點執行。這個機制為程式的邏輯提供了非常大的自由度,可以利用此特性容易的構建頁面流引擎或工作流引擎。即使是業務流程引擎,也會由此獲得更大的自由度。

由於支援流程的可重入性,在本流程處理當中,不僅可以在當前流程中進行切換與轉接,還可以流轉到其他流程的節點當中,這在業務處理及頁面處理,流程處理方面都提供了極大的使得,但是這也是乙個雙刃劍,在提供了這麼靈活的功能的同時,也會導致業務流程看起來比較複雜,因此,控制方面最好由架構師或核心開發人員來編寫,普通開發人員只開發具體的業務點即可。 12

3456

78910

11< /flow>

helloworldcomponent的原始碼如下:12

3456

78910

1112

public class helloworldcomponent implements componentinte***ce

public void setname(string name)

public void execute(context context)

}可以看出,所有元件必須實現componentinte***ce 介面

從其實現邏輯可以看出,它就是把「hello, 」加上輸入的名字,放在了環境變數的result當中。下面看看執行結果:

a.按預設開始結點開始執行 12

3context context = new contextimpl();

flowexecutor.execute("1000",context);

assertequals("hello, world", context.get("result"));

b.從指定節點開始執行12

3context context = new contextimpl();

flowexecutor.execute("1000","begin", context);

assertequals("hello, world", context.get("result"));

可以看到確實是執行並返回了結果,但是它的執行機理是怎麼樣的呢??

實際上,上面的流程是乙個簡化的流程,就是說tiny流程引擎的有些引數不輸入,也可以按照約定正確的執行,實際上寫得完整的話,例子是下面這個樣子的:12

3456

78910

1112

1314

some thing....

< /flow>

其中flow節點的屬性含義為:

id,唯一確定乙個流程

privatecontext,如果是true,則在流程單獨申請乙個context,否則共用呼叫者的context,這樣可以有效避免環境變數衝突問題

extend-flow-id,繼承的流程id,這個繼承id是乙個非常強大的功能,後面詳細介紹

version版本號,同一id的流程可以存在多個版本,訪問時,如果不指定版本則預設採用最新版本

name,title僅用於說明其英文,中文名稱,易於理解而已。

default-node-id表示,預設執行節點,即如果乙個元件執行完畢,其項值沒有指定下一處理節點則執行預設節點

begin-node-id,開始節點

end-node-id,結束節點

如果不指定,則begin-node-id預設為begin,end-node-id預設為end

node節點:id必須指定,在乙個流程當中id必須唯一。

component節點

class-name用於指定組織實現類名

properties是元件的屬性列表

property中的name與value是元件的屬性的值,value,這裡傳入的是個字串,但是實際當中可以處理中可以非常靈活,後面再介紹。

next-nodes,是指根據執行結果進行後續處理的規則。

next-node,具體的一條規則,component-result,匹配項,支援正規表示式,節點中的元件執行結果進行匹配,匹配成功則執行此規則中的下一節點。

exception-type是異常的類名稱,如果出現異常且與這裡定義的型別匹配,則執行此規則中的下一節點。

上面說到繼承,流程繼承實現起來是非常簡單的,只要在extend-flow-id屬性中指定即可。

繼承不支援多繼承,即流程只能繼承自乙個流程,但是可以支援多層繼承,即

a>b>c>d.....

實際開發過程中,不要把繼承搞得太複雜,這樣會把程式邏輯搞得更難理解的。

繼承實際會起到什麼作用呢?

首先,會繼承一些屬性,另外會把節點資訊繼承過來。

簡單來說就是:兩者都有,當前流程說了算,當前沒有,父流程說了算。

繼承應用到什麼場景呢??

繼承應用於業務處理的模式非常相似,只有中間處理環境不同的時候。

比如:abcd ---o--- -d -c -b -a

型別的業務處理流程,只有o不同,其他處理模式完全相同,此時採用繼承方式都非常舒服了,

只要定義父流程,在子流程中只用定義o乙個流程節點即可。以後要統一進行流程調整,只要在父流程中進行調整就可以了。

比如:flow aa定義為 12

3456

78910

1112

1314

1516

1718

19< /flow>

flow bb定義為 12

3456

78910

11< nodes>

< node id="hello">

< component class-name="org.tinygroup.flow.helloworldcomponent">

< properties>

< property name="name" value="world" />

< /properties>

< /component>

< /node>

< /nodes>

< /flow>

則流程bb也可以順利執行,且執行結果是hello, world

非常重要的乙個亮點就是屬性賦值。

屬性賦值是否好用,決定了框架的易用性。

可以支援常量賦值"1"表示數字常量

aa 表示字串常量可以支援,環境變數賦值

比如:xx表示從環境變數取xx鍵值的物件

可以支援屬性賦值

比如:xx.abc表示取環境變數xx的屬性abc

比如:xx.abc.def表示取環境變數xx的屬性abc的屬性def

可以支援組合賦值

比如:$-$

表示把環境aa中的屬性abc的屬性def中間加"-"再加上環境變數bb中的cc的屬性的dd屬性

其中屬性的層次不受限制。

另外,取值方式,也支援自行擴充套件:

比如:可以用$也取在環境中xmlkey對應的xml節點的aa屬性

所以,只有想不到的,沒有做不到的。

應用開發與部署方式,比較典型的有b/s與b/a/s,c/a/s等。對於b/a/s和c/a/s方式,因為a與b和c是分離部署的,所以,所有的內容都需要是通過context進行傳遞的。

如果是通過分離式部署,那麼就需要通過網路來傳遞請求環境資料。

如果是想通過b/s環境來構建系統,此時就會期望通過http處理執行緒來同布呼叫流程處理結果。

同時,有時流程處理的資料可能是在request,requestattribute,session,cookie中,如果把這些資料copy到環境當中去,其實是有較大的效能消耗的。

本流程引擎即支援通過服務方式呼叫,也可以通過短路方式進行呼叫。

雖然我們推薦使用b/a/s體系架構,但是不能否認,目前我們的許多產品還是在b/s架構下執行的。

但是好在,這個對於流程引擎來說,他並不直接訪問request和session,cookie等內容,所以,即使是整合在一起部署,也不妨礙進行分離式部署,依然可以保證服務的無狀態特性,前提就是需要實現乙個context的介面。

小結:

tiny的流程引擎,提供了相當強悍的功能及擴充套件性,上面只說了一部分,有些也沒有完全說清楚,實際上,還提供了包含el表示式等許多高階功能,對於期望進行流程式編排開發來說,有相當好的支援。

目前在tiny框架中,業務流程編排及頁面流程編排都是基於此引擎構建,應用效果非常良好。未來會基於其構建工作流引擎。

業務流程管理

業務流程管理 課程背景 當今企業之間的競爭,實際上是商業模式及流程能力之間的競爭。一方面,流程是實現商業模式的核心載體,企業需要打造以客戶為導向的端到端流程。另一方面,流程是企業管理體系的關鍵模組,隨著企業的成長,需要不斷提公升流程成熟度,把例外變成例行 把經驗教訓總結到流程中去。隨著資訊時代的來臨...

變更業務流程

1 提交申請 sp於每月18日 前通過sims 向接入省公司提交新增業務申請。2 新增業務初評與測試 sp配合省公司於當月20日前 完成新增業務初評,並對 初評通過的業務完成測試 包括業務測試和計費測試 3 新增業務評估 省公司於當月22日前通過sims電子打分系統進行業務評估。接入省公司受理部門於...

OTA 業務流程

ota的作用 通過無線網路,公升級終端軟體。軟體寫入 寫入active分割槽,還是寫入disactive分割槽?寫入當前分割槽容易自斷筋脈。因而寫入disctive分割槽。寫入方式,按二進位制寫入,還是按檔案寫入?按二進位制寫入簡單粗暴,按位址逐個寫過去。按檔案寫入,需要關心檔案的位置和讀寫屬性,繁...