Activiti工作流框架——快速上手

    一、前言

  

  最近在做公司的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軟件在2010517發佈的業務流程管理(BPM框架,它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。Activiti基於Apache許可的開源BPM平臺,創始人Tom BaeyensJBoss 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

 

    三、開始入(biao)門(che)

    

  經過準備工作之後就開始入門啦

  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提供了友好的接口,屏蔽了很多細節,使用起來不是很難。

 

     這篇博客從上午寫到下午,脖子反抗了多次╮(╯▽╰)╭。假如對你有幫助的話,點個贊吧

 

 

     本文禁止一切形式轉載!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章