最近在做公司的OA,裏面有用到工作流,公司用的是 jbpm4,感覺比較老,資料有點少,就先學學 新一點的 activiti ㄟ(▔▽▔)ㄏ
首先工作流的概念是:工作流(Workflow),就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文檔、信息或任務的過程自動進行,從而實現某個預期的業務目標,或者促使此目標的實現”。
比如請假可以看做一個流程,首先需要項目經理審批,項目經歷審批完了就部門經理審批,要是你請假的天數有點長還得更上一級的人審批。假如我們要自己實現的話得設計幾張表,然後原來的表裏面還要加字段來記錄狀態,流程要變的話就更是要命。所以就有了工作流,activiti就屬於工作流的一種實現, 它幫你把通用的東西搭建好,然後提供接口給你。(好像框架都是這樣~)
activiti的實現方式也和我們自己實現一樣:建表,在表裏面存儲流程相關的數據,不過它設計的表是通用的,並且提供好了非常簡單好用的接口給我們,讓我們根本就不用和數據庫打交道。
1、既然是框架,那就得有jar包
這裏我提供了activiti5的jar包,直接訪問鏈接就可以下載
https://files.cnblogs.com/files/summertime-wu/activiti-lib1.zip
https://files.cnblogs.com/files/summertime-wu/activiti-lib1.zip
分兩次上傳了,因爲博客園不允許一次上傳超過10兆的東西 (*▔^▔*)
2、作爲一個框架的尊嚴,當然得有配置文件
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 流程引擎配置對象 --> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/> <property name="jdbcUrl" value="jdbc:mysql:///activiti_day1"/> <property name="jdbcUsername" value="root"/> <property name="jdbcPassword" value="root"/> <property name="databaseSchemaUpdate" value="true"/> </bean> <!-- 使用工廠創建流程引擎對象 --> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration"/> </bean> </beans>
關於這個流程引擎對象後面有解釋,流程引擎工廠看名字就知道ㄟ(▔,▔)ㄏ
3、安裝eclipse插件
Activiti5是由Alfresco軟件在2010年5月17日發佈的業務流程管理(BPM)框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。Activiti基於Apache許可的開源BPM平臺,創始人Tom Baeyens是JBoss jBPM的項目架構師,它特色是提供了eclipse插件,開發人員可以通過插件直接繪畫出業務流程圖。 我們下面來安裝這個插件
然後選Activiti Diagram,就可以新建一個流程圖文件
總的來說這個插件是用來畫流程圖的,告訴框架我要的流程是怎麼個走法,也可以不用插件自己手寫,但是會累死↖(▔^▔)↗(就像hibernate實體類映射一樣,都是用插件生成的),生成的文件名後綴是bpmn
這個流程配置文件就是用來展示流程是什麼樣的,可以用這個插件打開顯示爲圖片,也可以以xml的方式打開,它本質上就是xml,不過爲了方便插件幫你展示爲圖片
用插件打開一個流程圖文件是這樣的:
用xml方式打開是這樣的:
當然還有最後一步別忘了!
因爲假如要定義一個流程的話就需要bpmn和jpg兩個文件,至於爲什麼。。。那就是框架就這麼定義的
4、建表
還記得之前說的嗎,activiti它也是用數據庫記錄我們的流程數據,所以,我們得爲它建表。這個框架還是很方便的,可以自動幫我們建表
備註:這個activiti框架既可以用於普通java項目,也可以用於web項目,建項目一定要記得導jar包,加jdbc驅動,加配置文件,配置文件裏面的數據庫配置也要改成你自己的 切記切記~
執行一下這個test2方法就建好表了:
備註:我們調用test2方法的時候,activiti就會執行自己jar包裏面的珍藏的sql文件乀(ˉεˉ乀),有興趣可以打開看看
解釋一下這些表:
5、畫流程
這個插件用起來還是蠻簡單的,一看就會,不過有點bug
經過準備工作之後就開始入門啦
1、準備工作裏面最後一步畫了一個流程圖,保存之後會有兩個文件,一個是原本自己建的bpmn後綴的文件,還有一個是自動幫你生成的jpg。
這個流程我們用插件定義好了,接下來我們要乾的事就是把它假如到數據庫裏面(部署流程定義):
activiti裏面的操作都用到一個叫工作流引擎(ProcessEngine)的東西,它就是工作流的核心,可以把它理解爲電腦的cpu,幹什麼事情都要它來執行
然後每次執行一個方法都要創建它不方便,下面的栗子裏就把它當作成員變量
這樣我們就創建了一個請假流程,然後打印這個流程的id,
接下來就是一些api的使用了,用起來不難,但不知道是怎麼實現的,感覺我現在的工作都是在用別人寫好的輪子,雖然方便,但是一報錯就懵了
2、查詢流程定義
3、根據流程定義啓動流程實例
流程實例:根據某個流程定義一次具體的執行過程就是一個流程實例。流程定義和流程實例一對多。這個就有點像類和對象,流程定義是一個模板,然後批量生產流程實例
舉個栗子:你定義一套請假流程(流程定義),然候別人要請假都是要走這個流程,而且會有很多次(流程實例)
備註:這個id就是之前查到的
4、查詢個人任務
假如流程走到這個人這裏,就可以查到他名下有一個任務等着他處理,就像你申請請假,然後你的部門經理就需要處理這個請求
5、辦理個人任務
6、API總結
到此爲此,我們就走完了一個完整的流程
1、設置流程變量
這個就相當於這個流程實例的一些屬性,是以鍵值對的方式存儲於數據庫,如上圖:qjyy是鍵,不想上班 是值。因爲每個人的請假原因都不相同,所以我們需要定義一些屬性來存儲一些個性化的東西。
總共有四種方式設置流程變量
1.1 啓動流程實例時設置
備註:這個processDefinitionKey就是流程定義的key,這個key是我們當初畫圖時候定義的,假如沒有定義默認是myProcess;variables就是一個map用來存儲我們需要加入的流程變量
1.2 辦理任務時設置
1.3 使用RuntimeService的set方法設置
1.4 使用 TaskService 的set方法設置
注意:如果設置的是自定義的類型,需要實現序列號接口
2、獲取流程變量
總共有三種方式獲取流程變量
2.1 使用RuntimeService的get方法獲取
2.2 使用TaskService的get方法獲取
2.3 使用框架提供的表單式獲取 (重要)
之前這個都是寫死了的,比如第一個流程我寫的是王五,然後這個流程就只能是王五操作,但實際情況是誰都可以申請,所以我們要把這個改成活的,activity提供了類似el表達式的操作
如上圖我寫的是 ${loginUser} 然後啓動流程實例的時候就會去找鍵爲loginUser的流程變量,所以我們要在啓動流程實例前確保有loginUser的流程變量,否則會拋異常,然後實際項目中就是從session中取出當前用戶的名字,然後設置loginUser的流程變量,再然後activiti框架就會自動幫你取出來,流程實例的申請人就是當前用戶。
3、組任務
有時候流程不止會有一個執行人,比如你的財務申請,整個財務部都可以審批。所以我們需要把原本的一個人改成一個組,如下圖
創建組:
創建用戶:
建立用戶和組的關係:
查詢組任務:
拾取組任務:
4、排他網關
大部分時候流程不會是一條直線,分支是很常見的情況,然後需要一個東西決定流程實例往哪條分支走,這個東西就是排他網關
圖中的condition就是這個網關的調教,假如請假天數小於3,就往上走,假如小於3,就往下走。可以看到這個用了activiti提供的el表達式,然後這個 qjts 很明顯就是從流程實例變量裏面取出來的。
至於什麼爲上,什麼爲下,這個由這條分支的id大小決定的。
下面是溫習一下兩種方式設置流程變量
5、與spring整合
和spring整合非常簡單,就是改下配置文件
5.1使用spring提供的流程引擎配置對象
5.2 提供數據源和事務管理器
5.3 使用 spring 提供的流程引擎工廠 bean創建流程引擎對象
然後就完成整合了
總的來說,activiti提供了友好的接口,屏蔽了很多細節,使用起來不是很難。
這篇博客從上午寫到下午,脖子反抗了多次╮(╯▽╰)╭。假如對你有幫助的話,點個贊吧
本文禁止一切形式轉載!