天天看點

Activiti 實戰篇 小試牛刀

1:工作流的概念

Activiti 實戰篇 小試牛刀
Activiti 實戰篇 小試牛刀

1) 假設:這兩張圖就是華誼兄弟的請假流程圖 

2) 圖的組成部分: 

a. 人物:範冰冰 馮小剛 王中軍 

b. 事件(動作):請假、準許、不準許

Activiti 實戰篇 小試牛刀
Activiti 實戰篇 小試牛刀

工作流(workflow),就是“業務過程的部分或整體在計算機應用環境下的自動化”,它主要解決的是“使在多個參與者之間按照某種預定義的規則傳遞文檔、資訊或任務的過程自動進行,進而實作某個預期的業務目标,或者促使此目标的實作”。 

工作流管理系統(workflow management system, wfms)是一個軟體系統,它完成工作量的定義和管理,并按照在系統中預先定義好的工作流規則進行工作流執行個體的執行。工作流管理系統不是企業的業務系統,而是為企業的業務系統的運作提供了一個軟體的支撐環境。 

工作流管理聯盟(wfmc,workflow management coalition)給出的關于工作流管理系統的定義是:工作流管理系統是一個軟體系統,它通過執行經過計算的流程定義去支援一批專門設定的業務流程。工作流管理系統被用來定義、管理、和執行工作流程。 

工作流管理系統的目标:管理工作的流程以確定工作在正确的時間被期望的人員所執行——在自動化進行的業務過程中插入人工的執行和幹預。 

3:activiti介紹 

activiti5是由alfresco軟體在2010年5月17日釋出的業務流程管理(bpm)架構,它是覆寫了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴充的可執行流程語言架構。activiti基于apache許可的開源bpm平台,創始人tom baeyens是jboss jbpm的項目架構師,它特色是提供了eclipse插件,開發人員可以通過插件直接繪畫出業務 

流程圖。 

Activiti 實戰篇 小試牛刀

3.1:工作流引擎 

processengine對象,這是activiti工作的核心。負責生成流程運作時的各種執行個體及資料、監控和管理流程的運作。 

3.2:bpmn 

業務流程模組化與标注(business process model and notation,bpmn) ,描述流程的基本符号,包括這些圖元如何組合成一個業務流程圖(business process diagram)

3.3:資料庫(先了解後看) 

activiti資料庫支援: 

activiti的背景是有資料庫的支援,所有的表都以act_開頭。 第二部分是表示表的用途的兩個字母辨別。 用途也和服務的api對應。 

act_re_*: ‘re’表示repository。 這個字首的表包含了流程定義和流程靜态資源 (圖檔,規則,等等)。 

act_ru_*: ‘ru’表示runtime。 這些運作時的表,包含流程執行個體,任務,變量,異步任務,等運作中的資料。 activiti隻在流程執行個體執行過程中儲存這些資料, 在流程結束時就會删除這些記錄。 這樣運作時表可以一直很小速度很快。 

act_id_*: ‘id’表示identity。 這些表包含身份資訊,比如使用者,組等等。 

act_hi_*: ‘hi’表示history。 這些表包含曆史資料,比如曆史流程執行個體, 變量,任務等等。 

act_ge_*: 通用資料, 用于不同場景下,如存放資源檔案。

表結構操作: 

3.3.1:資源庫流程規則表 

1) act_re_deployment 部署資訊表 

2) act_re_model 流程設計模型部署表 

3) act_re_procdef 流程定義資料表 

3.3.2:運作時資料庫表 

1) act_ru_execution 運作時流程執行執行個體表 

2) act_ru_identitylink 運作時流程人員表,主要存儲任務節點與參與者的相關資訊 

3) act_ru_task 運作時任務節點表 

4) act_ru_variable 運作時流程變量資料表 

3.3.3:曆史資料庫表 

1) act_hi_actinst 曆史節點表 

2) act_hi_attachment 曆史附件表 

3) act_ih_comment 曆史意見表 

4) act_hi_identitylink 曆史流程人員表 

5) act_hi_detail 曆史詳情表,提供曆史變量的查詢 

6) act_hi_procinst 曆史流程執行個體表 

7) act_hi_taskinst 曆史任務執行個體表 

8) act_hi_varinst 曆史變量表 

3.3.4:組織機構表 

1) act_id_group 使用者組資訊表 

2) act_id_info 使用者擴充資訊表 

3) act_id_membership 使用者與使用者組對應資訊表 

4) act_id_user 使用者資訊表 

這四張表很常見,基本的組織機構管理,關于使用者認證方面建議還是自己開發一套,元件自帶的功能太簡單,使用中有很多需求難以滿足 

3.3.5:通用資料表 

1) act_ge_bytearray 二進制資料表 

2) act_ge_property 屬性資料表存儲整個流程引擎級别的資料,初始化表結構時,會預設插入三條記錄, 

3.4:activiti.cfg.xml(activiti的配置檔案) 

activiti核心配置檔案,配置流程引擎建立工具的基本參數和資料庫連接配接池參數。 

定義資料庫配置參數: 

 jdbcurl: 資料庫的jdbc url。 

 jdbcdriver: 對應不同資料庫類型的驅動。 

 jdbcusername: 連接配接資料庫的使用者名。 

 jdbcpassword: 連接配接資料庫的密碼。 

基于jdbc參數配置的資料庫連接配接 會使用預設的mybatis連接配接池。 下面的參數可以用來配置連接配接池(來自mybatis參數): 

 jdbcmaxactiveconnections: 連接配接池中處于被使用狀态的連接配接的最大值。預設為10。 

 jdbcmaxidleconnections: 連接配接池中處于空閑狀态的連接配接的最大值。 

 jdbcmaxcheckouttime: 連接配接被取出使用的最長時間,超過時間會被強制回收。 預設為20000(20秒)。 

 jdbcmaxwaittime: 這是一個底層配置,讓連接配接池可以在長時間無法獲得連接配接時, 列印一條日志,并重新嘗試擷取一個連接配接。(避免因為錯誤配置導緻沉默的操作失敗)。 預設為20000(20秒)。 

示例資料庫配置: 

Activiti 實戰篇 小試牛刀

也可以使用javax.sql.datasource。 (比如,apache commons的dbcp): 

Activiti 實戰篇 小試牛刀

3.5:logging.properties(日志處理) 

日志的配置檔案,activiti操作資料庫的時候,整合的日志檔案 

4:準備環境 

4.1:activiti5 軟體環境 

1) jdk1.6或者更高版本 

2) 支援的資料庫有:h2, mysql, oracle, postgres, mssql, db2等。 

3) 支援activiti5運作的jar包 

4) 開發環境為eclipse3.7或者以上版本,myeclipse為8.6版本 

4.2:相關資源下載下傳 

1) jdk可以到sun的官網下載下傳 

2) 資料庫,例如:mysql可以在官網上下載下傳。 

3) activiti也可以到activiti官方網站下載下傳得到。 

4) eclipse3.7或者myeclipse8.6也可以到相應的網站上獲得下載下傳。 

4.3:安裝流程設計器(eclipse插件) 

4.3.1:安裝方式一 

在有網絡的情況下,安裝流程設計器步驟如下: 

1) 打開 help -> install new software. 在如下面闆中: 

Activiti 實戰篇 小試牛刀

2) 在如下install界面闆中,點選add按鈕: 

Activiti 實戰篇 小試牛刀

配置新裝插件的位址和名稱

3) 然後填入下列字段 

name: activiti bpmn 2.0 designer 

Activiti 實戰篇 小試牛刀

4) 回到install界面,在面闆正中清單中把所有展示出來的項目都勾上: 

Activiti 實戰篇 小試牛刀

5) 點選複選框 

在detail部分記得選中 “contact all updates sites..” , 因為它會檢查所有目前安裝所需要的插件并可以被eclipse下載下傳.

6) 安裝完以後,點選建立工程new->other…打開面闆,如果看到下圖内容: 

Activiti 實戰篇 小試牛刀

說明安裝成功了。 

4.3.2:安裝方式二 

在沒有網絡的情況下,安裝流程設計器步驟如下: 

1) 解壓老師發給大家的 壓縮包 

2) 把壓縮包中的内容放入eclipse根目錄的dropins檔案夾下 

3) 重新開機eclipse,點選建立工程new->other…打開面闆,如果看到下圖内容: 

Activiti 實戰篇 小試牛刀

說明安裝成功了 

4.4:對流程設計器的使用說明 

打開菜單windows->preferences->activiti->save下流程流程圖檔的生成方式: 

Activiti 實戰篇 小試牛刀

雖然流程引擎在單獨部署bpmn檔案時會自動生成圖檔,但在實際開發過程中,自動生成的圖檔會導緻和bpmn中的坐标有出入,在實際項目中展示流程目前位置圖會有問題。 

所在完成以上配置後,會由我們自己來管理流程圖檔。在釋出流程時把流程規則檔案和流程圖檔一起上傳就行了。 

4.5:準備activiti5開發環境 

4.5.1:添加activiti5的jar包 

在activiti-5.13->wars目錄下是一些示例項目,解壓activiti-rest項目,導入activiti-rest目錄中web-inf\lib下所有包。添加到classpath中。 

由于我們使用的是mysql資料庫,mysql資料庫的連結驅動activiti官方包中并沒有提供,需要我們自己導入。手動導入mysql-connector-java.jar,添加到classpath下。 

4.5.2:初始化資料庫 

Activiti 實戰篇 小試牛刀

在activiti中,在建立核心的流程引擎對象時會自動建表。如果程式正常執行,mysql會自動建庫,然後建立23張表。

4.5.3:添加并制定配置檔案 

在actiiti5中定制流程必定會操作到資料庫,如果都像上面那樣寫一大段代碼會非常麻煩,是以我們可以把資料庫連接配接配置寫入配置檔案。 

在activiti5的官方示例中并沒有現成的配置檔案,是以先得找到activiti-rest\web-inf\classes下有:

4.5.3.1:activiti-context.xml : 

一個類似spring結構的配置檔案,清空内容後改名為activiti.cfg.xml,用來做流程引擎的相關配置。 

按照上面代碼配置processengineconfiguration對象,主要定義資料庫的連接配接配置和建表政策,配置檔案代碼如下: 

Activiti 實戰篇 小試牛刀

java代碼如下: 

Activiti 實戰篇 小試牛刀

createprocessengineconfigurationfromresource的參數值為我們添加的配置檔案activiti.cfg.xml的名稱,執行java代碼,流程引擎對象建立成功運作後資料庫會自動建表。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

4.5.3.2:log4j.properties 日志配置檔案 

把兩個檔案放入resource目錄下即可。

5:核心api 

5.1:processengine 

說明: 

1) 在activiti中最核心的類,其他的類都是由他而來。 

2) 産生方式:

在前面看到了兩種建立processengine(流程引擎)的方式,而這裡要簡化很多,調用processengines的getdefaultproceeengine方法時會自動加載classpath下名為activiti.cfg.xml檔案。 

3) 可以産生repositoryservice

4) 可以産生runtimeservice

5) 可以産生taskservice

各個service的作用: 

repositoryservice 管理流程定義 

runtimeservice 執行管理,包括啟動、推進、删除流程執行個體等操作 

taskservice 任務管理 

historyservice 曆史管理(執行完的資料的管理) 

identityservice 組織機構管理 

formservice 一個可選服務,任務表單管理 

managerservice

5.2:repositoryservice 

是activiti的倉庫服務類。所謂的倉庫指流程定義文檔的兩個檔案:bpmn檔案和流程圖檔。 

1) 産生方式

2) 可以産生deploymentbuilder,用來定義流程部署的相關參數

3) 删除流程定義

5.3:runtimeservice 

是activiti的流程執行服務類。可以從這個服務類中擷取很多關于流程執行相關的資訊。 

5.4:taskservice 

是activiti的任務服務類。可以從這個類中擷取任務的資訊。 

5.5:historyservice 

是activiti的查詢曆史資訊的類。在一個流程執行完成後,這個對象為我們提供查詢曆史資訊。 

5.6:processdefinition 

流程定義類。可以從這裡獲得資源檔案等。 

5.7:processinstance 

代表流程定義的執行執行個體。如範冰冰請了一天的假,她就必須發出一個流程執行個體的申請。一個流程執行個體包括了所有的運作節點。我們可以利用這個對象來了解目前流程執行個體的進度等資訊。流程執行個體就表示一個流程從開始到結束的最大的流程分支,即一個流程中流程執行個體隻有一個。 

5.8:execution 

activiti用這個對象去描述流程執行的每一個節點。在沒有并發的情況下,execution就是同processinstance。流程按照流程定義的規則執行一次的過程,就可以表示執行對象execution。 

如圖為processinstance的源代碼: 

Activiti 實戰篇 小試牛刀

從源代碼中可以看出processinstance就是execution。但在現實意義上有所差別: 

Activiti 實戰篇 小試牛刀

在單線流程中,如上圖的貸款流程,processinstance與execution是一緻的。 

Activiti 實戰篇 小試牛刀

這個例子有一個特點:wire money(彙錢)和archive(存檔)是并發執行的。 這個時候,總線路代表processinstance,而分線路中每個活動代表execution。 

總結: 

* 一個流程中,執行對象可以存在多個,但是流程執行個體隻能有一個。 

* 當流程按照規則隻執行一次的時候,那麼流程執行個體就是執行對象。

6:helloworld程式(模拟流程的執行) 

6.1:流程圖:

Activiti 實戰篇 小試牛刀

6.2:部署流程定義 

Activiti 實戰篇 小試牛刀

這裡使用repositoryservice部署流程定義 

addclasspathresource表示從類路徑下加載資源檔案,一次隻能加載一個檔案 

6.3:啟動流程執行個體 

Activiti 實戰篇 小試牛刀

這裡使用runtimeservice啟動流程執行個體 

6.4:檢視我的個人任務 

Activiti 實戰篇 小試牛刀

這裡使用taskservice完成任務的查詢 

6.5:完成我的個人任務 

Activiti 實戰篇 小試牛刀

這裡使用taskservice完成任務的辦理

7:管理流程定義 

7.1:設計流程定義文檔 

7.1.1:流程圖 

Activiti 實戰篇 小試牛刀

7.1.2:bpmn檔案 

bpmn 2.0根節點是definitions節點。 這個元素中,可以定義多個流程定義(不過我們建議每個檔案隻包含一個流程定義, 可以簡化開發過程中的維護難度)。 一個空的流程定義看起來像下面這樣。注意,definitions元素 最少也要包含xmlns 和 targetnamespace的聲明。 targetnamespace可以是任意值,它用來對流程執行個體進行分類。 

Activiti 實戰篇 小試牛刀

說明:流程定義文檔有兩部分組成: 

1) bpmn檔案 

流程規則檔案。在部署後,每次系統啟動時都會被解析,把内容封裝成流程定義放入項目緩存中。activiti架構結合這個xml檔案自動管理流程,流程的執行就是按照bpmn檔案定義的規則執行的,bpmn檔案是給計算機執行用的。 

2) 展示流程圖的圖檔 

在系統裡需要展示流程的進展圖檔,圖檔是給使用者看的。

7.2:部署流程定義(classpath路徑加載檔案) 

Activiti 實戰篇 小試牛刀

1) 先擷取流程引擎對象:在建立時會自動加載classpath下的activiti.cfg.xml

2) 首先獲得預設的流程引擎,通過流程引擎擷取了一個repositoryservice對象(倉庫對象) 

3) 由倉庫的服務對象産生一個部署對象配置對象,用來封裝部署操作的相關配置。 

4) 這是一個鍊式程式設計,在部署配置對象中設定顯示名,上傳流程定義規則檔案 

5) 向資料庫表中存放流程定義的規則資訊。 

6) 這一步在資料庫中将操作三張表: 

a) act_re_deployment(部署對象表) 

存放流程定義的顯示名和部署時間,每部署一次增加一條記錄。 

Activiti 實戰篇 小試牛刀
Activiti 實戰篇 小試牛刀

deployment deployment = processengine.getrepositoryservice()// 

.createdeployment().name(“入門程式”)// 

.addclasspathresource(“hello/helloworld.bpmn”)// 從classpath的資源中加載,一次隻能加載一個檔案 

// .addclasspathresource(“diagrams/helloworld.png”)// 

// 從classpath的資源中加載,一次隻能加載一個檔案 

.deploy(); 

b) act_re_procdef(流程定義表) 

存放流程定義的屬性資訊,部署每個新的流程定義都會在這張表中增加一條記錄。 

注意:當流程定義的key相同的情況下,使用的是版本更新 

Activiti 實戰篇 小試牛刀
Activiti 實戰篇 小試牛刀

對應的封裝類:

代碼的操作: 

/* 查詢流程定義 /

33

程式的輸出: 

流程定義id:helloworld:1:4 

流程定義的名稱:helloworldprocess 

流程定義的key:helloworld 

流程定義的版本:1 

資源名稱bpmn檔案:hello/helloworld.bpmn 

資源名稱png檔案:hello/helloworld.helloworld.png 

部署對象id:1 

c) act_ge_bytearray(資源檔案表) 

存儲流程定義相關的部署資訊。即流程定義文檔的存放地。每部署一次就會增加兩條記錄,一條是關于bpmn規則檔案的,一條是圖檔的(如果部署時隻指定了bpmn一個檔案,activiti會在部署時解析bpmn檔案内容自動生成流程圖)。兩個檔案不是很大,都是以二進制形式存儲在資料庫中。 

Activiti 實戰篇 小試牛刀

7.3:部署流程定義(zip格式檔案) 

Activiti 實戰篇 小試牛刀
Activiti 實戰篇 小試牛刀

将 

壓縮成zip格式的檔案,使用zip的輸入流用作部署流程定義

7.4:檢視流程定義 

查詢流程定義的資訊 

Activiti 實戰篇 小試牛刀

結果: 

Activiti 實戰篇 小試牛刀

再部署一次運作結果為: 

Activiti 實戰篇 小試牛刀

可以看到流程定義的key值相同的情況下,版本是從1開始逐次更新的 

流程定義的id是【key:版本:生成id】 

1) 流程定義和部署對象相關的service都是repositoryservice。 

2) 建立流程定義查詢對象,可以在processdefinitionquery上設定查詢的相關參數 

3) 調用processdefinitionquery對象的list方法,執行查詢,獲得符合條件的流程定義清單 

4) 由運作結果可以看出: 

key和name的值為:bpmn檔案process節點的id和name的屬性值 

Activiti 實戰篇 小試牛刀

5) key屬性被用來差別不同的流程定義。 

6) 帶有特定key的流程定義第一次部署時,version為1。之後每次部署都會在目前最高版本号上加1 

7) id的值的生成規則為:{processdefinitionkey}:{processdefinitionversion}:{generated-id}, 這裡的generated-id是一個自動生成的唯一的數字 

8) 重複部署一次,deploymentid的值以一定的形式變化 

規則act_ge_property表生成 

Activiti 實戰篇 小試牛刀

7.5:删除流程定義 

删除部署到activiti中的流程定義。 

Activiti 實戰篇 小試牛刀

1) 因為删除的是流程定義,而流程定義的部署是屬于倉庫服務的,是以應該先得到repositoryservice 

2) 如果該流程定義下沒有正在運作的流程,則可以用普通删除。如果是有關聯的資訊,用級聯删除。項目開發中使用級聯删除的情況比較多,删除操作一般隻開放給超級管理者使用。 

7.6:擷取流程定義文檔的資源(檢視流程圖附件) 

查詢出流程定義文檔。主要查的是圖檔,用于顯示流程用。 

Activiti 實戰篇 小試牛刀

1) deploymentid為流程部署id 

2) resourcename為act_ge_bytearray表中name_列的值 

3) 使用repositoryservice的getdeploymentresourcenames方法可以擷取指定部署下得所有檔案的名稱 

4) 使用repositoryservice的getresourceasstream方法傳入部署id和資源圖檔名稱可以擷取部署下指定名稱檔案的輸入流 

5) 最後的有關io流的操作,使用fileutils工具的copyinputstreamtofile方法完成流程流程到檔案的拷貝,将資源檔案以流的形式輸出到指定檔案夾下 

7.7:附加功能:查詢最新版本的流程定義 

Activiti 實戰篇 小試牛刀

key value儲存 key 為key value為流程定義 

代碼: 

/*附加功能:查詢最新版本的流程定義*/

7.8:附加功能:删除流程定義(删除key相同的所有不同版本的流程定義) 

Activiti 實戰篇 小試牛刀

7.9:總結 

deployment 部署對象 

1、一次部署的多個檔案的資訊。對于不需要的流程可以删除和修改。 

2、對應的表: 

act_re_deployment:部署對象表 

act_re_procdef:流程定義表 

act_ge_bytearray:資源檔案表 

act_ge_property:主鍵生成政策表

processdefinition 流程定義 

1、解析.bpmn後得到的流程定義規則的資訊,工作流系統就是按照流程定義的規則執行的。

8:流程執行個體、任務的執行 

8.1:流程圖 

Activiti 實戰篇 小試牛刀

8.2:部署流程定義 

Activiti 實戰篇 小試牛刀

8.3:啟動流程執行個體 

Activiti 實戰篇 小試牛刀

1) 操作資料庫的act_ru_execution表,如果是使用者任務節點,同時也會在act_ru_task添加一條記錄 

act_ru_execution表,#正在執行的執行對象表 任務結束的之前隻有 一個 變化的字段是act_id 

Activiti 實戰篇 小試牛刀
Activiti 實戰篇 小試牛刀

8.4:查詢我的個人任務 

Activiti 實戰篇 小試牛刀

輸出: 

任務id:504 

任務名稱:送出申請 

任務的建立時間:sat aug 09 08:50:20 cst 2014 

任務的辦理人:張三 

流程執行個體id:501 

執行對象id:501 

流程定義id:helloworld:1:404 

接口:

1) 因為是任務查詢,是以從processengine中應該得到taskservice 

2) 使用taskservice擷取到任務查詢對象taskquery 

3) 為查詢對象添加查詢過濾條件,使用taskassignee指定任務的辦理者(即查詢指定使用者的代辦任務),同時可以添加分頁排序等過濾條件 

4) 調用list方法執行查詢,傳回辦理者為指定使用者的任務清單 

5) 任務id、名稱、辦理人、建立時間可以從act_ru_task表中查到。 

6) execution與processinstance見5.6和5.7章節的介紹。在這種情況下,processinstance相當于execution 

7) 如果assignee屬性為部門經理,結果為空。因為現在流程隻到了”填寫請假申請”階段,後面的任務還沒有執行,即在資料庫中沒有部門經理可以辦理的任務,是以查詢不到。 

8) 一個task節點和execution節點是1對1的情況,在task對象中使用execution_來表示他們之間的關系 

9) 任務id在資料庫表act_ru_task中對應“id_”列

附加: 

在activiti任務中,主要分為兩大類查詢任務(個人任務群組任務): 

1.确切指定了辦理者的任務,這個任務将成為指定者的私有任務,即個人任務。 

2.無法指定具體的某一個人來辦理的任務,可以把任務配置設定給幾個人或者一到 多個小組,讓這個範圍内的使用者可以選擇性(如有空餘時間時)來辦理這類任務,即組任務。 

先知道個人任務的查詢和辦理,組任務的操作後面講

8.5:辦理任務 

Activiti 實戰篇 小試牛刀

1) 是辦理任務,是以從processengine得到的是taskservice。 

2) 當執行完這段代碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有資料了,因為正在執行的任務中沒有資料。 

3) 對于執行完的任務,activiti将從act_ru_task表中删除該任務,下一個任務會被插入進來。 

4) 以”部門經理”的身份進行查詢,可以查到結果。因為流程執行到部門經理審批這個節點了。 

5) 再執行辦理任務代碼,執行完以後以”部門經理”身份進行查詢,沒有結果。 

6) 重複第3和4步直到流程執行完。 

act_ru_task表: 

Activiti 實戰篇 小試牛刀

8.6:查詢流程狀态(判斷流程正在執行,還是結束) 

Activiti 實戰篇 小試牛刀

/* 查詢流程狀态(判斷流程正在執行,還是結束) /

1) 因為是查詢流程執行個體,是以先擷取runtimeservice 

2) 建立流程執行個體查詢對象,設定執行個體id過濾參數 

3) 由于一個流程執行個體id隻對應一個執行個體,使用singleresult執行查詢傳回一個唯一的結果,如果結果數量大于1,則抛出異常 

4) 判斷指定id的執行個體是否存在,如果結果為空,則代表流程結束,執行個體在正在執行的執行對象表中已被删除,轉換成曆史資料。 

8.7:附加功能:查詢曆史任務(後面講) 

Activiti 實戰篇 小試牛刀

/*查詢曆史任務(後面講)/

表《historictaskinstance》 

8.8:附加功能:查詢曆史流程執行個體(後面講)

Activiti 實戰篇 小試牛刀

8.9:總結 

execution 執行對象 

按流程定義的規則執行一次的過程. 

對應的表: 

act_ru_execution: 正在執行的資訊 

act_hi_procinst:已經執行完的曆史流程執行個體資訊 

act_hi_actinst:存放曆史所有完成的活動 

processinstance 流程執行個體 

特指流程從開始到結束的那個最大的執行分支,一個執行的流程中,流程執行個體隻有1個。

注意 

(1)如果是單例流程,執行對象id就是流程執行個體id 

(2)如果一個流程有分支和聚合,那麼執行對象id和流程執行個體id就不相同 

(3)一個流程中,流程執行個體隻有1個,執行對象可以存在多個。

task 任務 

執行到某任務環節時生成的任務資訊。 

act_ru_task:正在執行的任務資訊 

act_hi_taskinst:已經執行完的曆史任務資訊

9:流程變量 

9.1:流程圖 

Activiti 實戰篇 小試牛刀

流程變量在整個工作流中扮演很重要的作用。例如:請假流程中有請假天數、請假原因等一些參數都為流程變量的範圍。流程變量的作用域範圍是隻對應一個流程執行個體。也就是說各個流程執行個體的流程變量是不互相影響的。流程執行個體結束完成以後流程變量還儲存在資料庫中。 

例如: 

Activiti 實戰篇 小試牛刀

即:

9.2:部署流程定義 

Activiti 實戰篇 小試牛刀

• 輸入流加載資源檔案的3種方式 

Activiti 實戰篇 小試牛刀
Activiti 實戰篇 小試牛刀

9.3:啟動流程執行個體 

Activiti 實戰篇 小試牛刀

9.4:設定流程變量 

Activiti 實戰篇 小試牛刀

1) 流程變量的作用域就是流程執行個體,是以隻要設定就行了,不用管在哪個階段設定 

2) 基本類型設定流程變量,在taskservice中使用任務id,定義流程變量的名稱,設定流程變量的值。 

3) javabean類型設定流程變量,需要這個javabean實作了serializable接口 

4) 設定流程變量的時候,向act_ru_variable這個表添加資料

9.5:擷取流程變量 

Activiti 實戰篇 小試牛刀

1) 流程變量的擷取針對流程執行個體(即1個流程),每個流程執行個體擷取的流程變量時不同的 

2) 使用基本類型擷取流程變量,在taskservice中使用任務id,流程變量的名稱,擷取流程變量的值。 

3) javabean類型設定擷取流程變量,除了需要這個javabean實作了serializable接口外,還要求流程變量對象的屬性不能發生變化,否則抛出異常。 

解決方案,在javabean對象中添加: 

private static final long serialversionuid = 6757393795687480331l; 

9.6:模拟流程變量的設定和擷取的場景 

Activiti 實戰篇 小試牛刀

1) runtimeservice對象可以設定流程變量和擷取流程變量 

2) taskservice對象可以設定流程變量和擷取流程變量 

3) 流程執行個體啟動的時候可以設定流程變量 

4) 任務辦理完成的時候可以設定流程變量 

5) 流程變量可以通過名稱/值的形式設定單個流程變量 

6) 流程變量可以通過map集合,同時設定多個流程變量 

map集合的key表示流程變量的名稱 

map集合的value表示流程變量的值

9.7:查詢曆史的流程變量 

Activiti 實戰篇 小試牛刀

1)曆史的流程變量查詢,指定流程變量的名稱,查詢act_hi_varinst表(也可以針對,流程執行個體id,執行對象id,任務id查詢)

9.8:流程變量的支援的類型 

如圖是從官網列出來的流程變量的類型: 

Activiti 實戰篇 小試牛刀

從圖中可以看出包括了大部分封裝類型和date、string和實作了serializable接口的類的類型。 

9.9:總結 

• 1:流程變量 

在流程執行或者任務執行的過程中,用于設定和擷取變量,使用流程變量在流程傳遞的過程中傳遞業務參數。 

act_ru_variable:正在執行的流程變量表 

act_hi_varinst:流程變量曆史表

• 2:擴充知識:setvariable和setvariablelocal的差別 

setvariable:設定流程變量的時候,流程變量名稱相同的時候,後一次的值替換前一次的值,而且可以看到task_id的字段不會存放任務id的值 

setvariablelocal: 

1:設定流程變量的時候,針對目前活動的節點設定流程變量,如果一個流程中存在2個活動節點,對每個活動節點都設定流程變量,即使流程變量的名稱相同,後一次的版本的值也不會替換前一次版本的值,它會使用不同的任務id作為辨別,存放2個流程變量值,而且可以看到task_id的字段會存放任務id的值 

例如act_hi_varinst 表的資料:不同的任務節點,即使流程變量名稱相同,存放的值也是不同的。 

如圖: 

Activiti 實戰篇 小試牛刀

2:還有,使用setvariablelocal說明流程變量綁定了目前的任務,當流程繼續執行時,下個任務擷取不到這個流程變量(因為正在執行的流程變量中沒有這個資料),所有查詢正在執行的任務時不能查詢到我們需要的資料,此時需要查詢曆史的流程變量。

10:流程執行曆史記錄 

10.1:查詢曆史流程執行個體 

查找按照某個流程定義的規則一共執行了多少次流程 

Activiti 實戰篇 小試牛刀

10.2:查詢曆史活動 

某一次流程的執行一共經曆了多少個活動 

Activiti 實戰篇 小試牛刀

10.3:查詢曆史任務 

某一次流程的執行一共經曆了多少個任務 

Activiti 實戰篇 小試牛刀

10.4:查詢曆史流程變量 

某一次流程的執行一共設定的流程變量 

Activiti 實戰篇 小試牛刀

10.5:總結 

由于資料庫中儲存着曆史資訊以及正在運作的流程執行個體資訊,在實際項目中對已完成任務的檢視頻率遠不及對代辦和可接任務的檢視,是以在activiti采用分開管理,把正在運作的交給runtimeservice、taskservice管理,而曆史資料交給historyservice來管理。 

這樣做的好處在于,加快流程執行的速度,因為正在執行的流程的表中資料不會很大。