如果把Fireflow engin當作一個黑箱子,那麼Fireflow engine需要關注如下幾個方面的接口。
1、客戶代碼調用engine的接口(啟動流程執行個體,簽收任務,完成任務等等)
2、engine與使用者管理系統的接口
3、engine與業務表單的接口
4、engine調用外部系統(engine調用外部代碼)
5、engine與資料存儲子系統的接口(engine與應用系統存儲層接口),以及事務的一緻性。
6、工作流資料與業務資料之間的接口
如果進一步打開這個“黑箱子”,Fireflow Engine還需要考慮如下問題
1、核心的實作,以及核心與Engine的其它邏輯的互動關系
2、轉移條件的計算
3、等等。。。
下面将逐一讨論這些問題。本篇首先讨論第一個問題:客戶代碼調用fireflow engine的接口。
很顯然,對于用戶端而言,fireflow的操作越簡單越好,涉及的對象約簡單越好。在fireflow中,對業務流程的一般操作可以歸結為:
1) 建立新流程執行個體
2) 相關崗位的操作員簽收工單
3) 相關工作的操作員完成工單
用戶端在調用中涉及的fireflow對象也很簡單
1) 流程執行個體 ProcessInstance
2) 工單Workitem
3) 與工單相關的另一個概念就是任務執行個體TaskInstance,一個TaskInstance可以産生0到n個工單,例如:正常情況下,一個審批任務執行個體隻産生一個Workitem;相關人員接受該Workitem後,可以“委派”給其他人完成該任務,進而産生一個新的Workitem,但是任務執行個體還是同一個。在會簽的情況下,一個TaskInstance也可以産生多個Workitem。如果一個任務是Application類型的(調用其它程式完成),則不會産生WorkItem。
那麼用什麼樣的一種模式實作上述功能呢,顯然,facade模式是一個必然的選擇。下圖是fireflow對外調用接口的類圖。
我們可以通過類比來了解這幅圖。FireflowSession相當于JDBC中的connection,是Fireflow的入口。通過jdbc操作資料庫首先需要獲得connection;同樣,操作fireflow,首先要建立一個FireflowSession執行個體。由于fireflow Engine是嵌入式的,那麼建立fireflowSession比建立connection簡單多了,就是一個new的過程。通過 FireflowSession可以獲得其它的工作流對象,例如ProcessInstance,TaskInstance,WorkItem;就像通過 Connection獲得Statement,resultSet一樣。
那麼FireflowSession到底起什麼作用呢?僅僅是其它fireflow對象的factory嗎?不是的。fireflowSession用到了Template模式,将一些通用的fireflow操作固化在裡面,客戶程式可以通過FireflowSessionCallBack擴充已有的功能。就像Spring中的大量的HibernateTemplate一樣。
