Activiti淺析,首發于Cobub。
]]>Activiti框架以及JBPM5框架都是BPM(Bussiness Process Manage)系統(符合BPM規范),都是BPMN2過程建模和執行環境。都是開源項目-遵循ASL協議( Apache的 軟件許可)。 都源自JBoss(Activiti5是jBPM4的衍生,jBPM5則基于Drools Flow)。 都很成熟,從無到有,雙方開始約始于2年半前。 都有對人工任務的生命周期管理。 Activiti5和jBPM5唯一的區別是jBPM5基于WebService – HumanTask標準來描述人工任務和管理生命周期。 如有興趣了解這方面的標準及其優點,可參閱WS – HT規范介紹 。 都使用了不同風格的 Oryx 流程編輯器對BPMN2建模。 jBPM5采用的是 Intalio 維護的開源項目分支。 Activiti5則使用了Signavio維護的分支。
那么activiti作為一種工作流框架,目前廣泛應用于眾多軟件開發公司。那么如果想要使用activiti開源工作流系統實現自己的業務系統,那么其實首先第一步,是要熟悉BPMN2.0的規范,當然這一步也不是必須的。BPMN2.0規范作為一種標準實現的是工作流業務系統當中可能會遇到的一些基本模型的建立。
目前主流的Java開發IDE為eclipse和intellij idea。這兩個開發工具都有支持Activiti的開發,擁有界面式的流程編輯器。通過對業務流程進行繪制,流程編輯器會對業務流程進行解析并生成一個.bpmn文件,其實質上就是一個.xml文件,該文件當中聲明式的說明了各個流程的實現以及業務類型,后續通過Activiti的流程引擎可以對該xml文件進行解析,并執行對應的操作及流程跳轉功能。
這里給出Activiti的Github社區網址,相關內容可以到上面下載咨詢。那么Activiti工作流系統基于的工作流引擎到底是個什么東西呢?目前Activiti工作流業務系統提供了一套基于java的API接口,流程引擎其實它是一個class類的實例,只是通過這個對象可以獲取到所有的關于工作流業務流程的內容以及操作所有的流程進行。如圖1.1是工作流引擎對象以及其可以派生的對象:
其中,activiti.cfg.xml文件為核心配置文件,該配置文件集成在Spring的IOC容器當中,可以產生ProcessEngineConfiguration對象,這個對象就是流程引擎的配置對象,ProcessEngine對象則為流程引擎對象,該對象是工作流業務系統的核心,所有的業務操作都是由這個對象所派生出來的對象實現。關于對象的操作請參考Activiti5的API文檔。
目前的Activiti5工作流業務系統總共涉及23張表,如圖1.2為表的相關信息。當然這些表并不是都是必須的,有些用不到的功能的表自然而然就不需要了。目前Activiti5的工作流業務系統支持MySql、Oracle和DB2等主流數據庫,默認使用的數據庫為H2。相關數據庫的配置參考相關文檔。
Activiti工作流業務系統對Spring的集成非常好,這對于熟悉Spring框架的開發人員來說是一種比較好的特性。但是Activiti框架當中并不是封裝了業務功能,只是實現了最基本的操作,可以使使用者更好地實現某些功能,但是由于activiti中并沒有對駁回進行有效的封裝,所以如果開發人員想使用駁回功能,那就需要自己通過activiti的API自己手動的封裝一個接口了。
那么對于Activiti工作流框架,我們怎么來使用呢?接下來,我們就來簡單的說一說activiti的使用方式。既然要使用activiti框架,先來看看Activiti的基礎編程框架:
接下來第一步是需要開發工具,前面我們說了,可以使用集成了acitiviti界面式流程編輯器功能的eclipse或者intellij idea。那么這里我們使用eclipse開發工具。如下圖所示:
第二步:則需要引入對應的activiti的jar包,可以手動下載下來,也可以使用maven項目管理工具統一管理軟件包。那么這里我們使用maven項目管理工具:
第三步:前面我們說過,activiti工作流業務系統需要23張表,那么表的創建那也是必不可少的,之前我們說過。可以通過activiti的工作流引擎的對象來創建。在這里我們就使用這種方式創建。
完成了上面的三步之后,那么接下來就是簡單的實現一個請假業務流程。第一步,畫流程圖,設置流程開始節點start和結束節點end,設置任務userTask。如下圖所示:
需要注意的是,該流程圖中的每一個userTask都需要設置下一個處理人assignee,可以使用流程變量動態設置處理人,也可以直接固定處理人,這里我們先固定處理人。如下圖所示:
完成了請假業務流程之后,我們來看看這個bpmn文件到底是個什么類型的文件,我們使用txt文本編輯器打開,發現類似于一個xml文件,只是后綴為.bpmn而已。如下圖所示:
接下來就是開始真正的代碼編寫了。前面我們說過activiti工作流框架與Spring幾乎完美的融合,但是這里我們只是涉及到activiti淺析,所以本文只是使用原生的api接口實現簡單的請假流程。
首先使用工作流引擎配置對象加載activiti.cfg.xml文件,前面說過activiti.cfg.xml為工作流的配置文件,這里貼出activiti的內容,使用的數據庫為mysql數據庫。
接下來可以使用流程引擎對象ProcessEngineConfiguration加載配置文件,通過配置對象獲取ProcessEngine對象,但是我們不采用配置文件的形式創建這個對象,那么接下來所有的內容都可以使用這個對象派生出來的內容完成所有的功能。其實剛才創建表的那段代碼就可以完成這個功能。
使用ProcessEngine對象加載請假流程配置文件,創建流程定義模板,也即是部署流程。接下來通過流程定義模板創建一個流程實例對象,填寫請假單,保存請假單,即創建一個請假流程。
這段代碼創建了請假流程的定義。
其中,engine為ProcessEngine的實例對象,processDefinitionId為流程定義的Id,該值在創建流程定義的時候就會生成,run.startProcessIntanceById為通過流程定義Id創建一個流程實例對象,這個流程實例對象就對應的是一次請假流程。
在通過創建的請假流程中,再提交請假流程到上級部門(例如:部門經理等),部門經理通過后,才能說明該請假流程完成,10002為任務的唯一標識。對應的流程圖中的每一個任務userTask對應一個taskId。
在本文中,請假流程的例子并沒有涉及到數據庫的操作,也就是說所有的數據庫的內容都是由activiti框架為我們完成,我們只需要實現對應的業務流程即可。這極大的簡化了工作流的相關內容,但是如果想要用好activiti工作流框架,那么就必須對這一套api文檔進行詳盡細致的了解及學習。如果想了解更多關于activiti對數據庫操作的內容。請參閱相關資料。
Activiti淺析,首發于Cobub。
]]>