activiti入門


最近項目有個工作流的需求,從頭開始學一下activiti,記錄一些問題。

1.去官網下載activiti7.0或者使用maven下載,並在idea中下載activiBPM流程插件

2.創建一個普通的maven依賴,添加activiti、mysql、mybatis、連接池、junit等jar包。推薦使用

相關配置如下:

<properties>
<activiti.version>7.0.0.Beta1</activiti.version>
</properties>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.activiti</groupId>-->
<!--<artifactId>activiti-json-converte</artifactId>-->
<!--<version>${activiti.version}</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.activiti</groupId>-->
<!--<artifactId>activiti-cloud-services</artifactId>-->
<!--<version>${activiti.version}</version>-->
<!--</dependency>-->

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.28</version>
</dependency>
</dependencies>
有兩個依賴下不下來,先不管它,后面再填坑

3.在resource下配置log4j,activiti.cfg.xml配置文件(

<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"/>
<!--數據庫用戶名和密碼-->
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<!--activiti數據庫表在生成時的策略-->
<!--true表示數據庫中存在相應的表就直接使用,不存在則創建-->
<property name="databaseSchemaUpdate" value="true"/>
</bean>

),注意bean的id和配置文件的名稱都不能修改。

4.創建一個單元測試類:

使用activiti提供的默認方式來創建mysql表需要使用activiti提供的工具類,
讀取配置文件生成,processEngine生成時會自動創建mysql的表。
public void testCreateDbTable(){

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
運行,這個時候會自動幫我們生成25張數據庫表,前提是要去手動創建好數據庫activiti,字符集為utf-8.

5.生成的數據庫表詳細說明
act開頭,代表是activiti的表,在流程和業務的表存在同一個數據庫中的時候,這個時候我們可以很容易區分開,
ge:一般數據,hi:歷史數據,流程定義:re,運行實例:ru,每個表的詳細內容就不介紹了,可以自行百度一首。

6.准備創建activiti工作流:
  1.定義流程:按照BPMN的規范,使用流程定義工具,用流程符號把整個流程描述出來
  2.流程部署,把畫好的流程定義文件,加載到數據庫表中,生成表的數據
  3.啟動流程:使用java代碼來操作數據庫表中的內容
7.使用idea流程設計器設計流程(就是我們一開始裝的activiti插件,將xml用圖形化展示編輯),在resources下創建bpmn目錄,創建一個實例evction.bpmn
開始編輯圖形流程,畫出節點的流向和指定節點的負責人,編輯結束后,將bpmn文件復制一份到桌面以防萬一,然后將bpmn文件的格式修改為xml,再右鍵點擊

 

 ,然后再到導出文件

 

 保存到桌面就可以了,然后將這個png文件復制到剛才的bpmn文件夾中,再將剛才的xml格式改為bpmn。

 

 過程中如果出現亂碼:
1.打開settings,找到file encodings配置選項,將項目編碼修改為UTF-8,應用即可

 

 

2.修改idea安裝路徑,配置文件,在以下2個配置文件末尾追加一行,-Dfile.encoding=UTF-8,注意不要有空格。修改之后,重啟idea.

 8.接着用java代碼部署,就是將流程寫入數據庫中。

 

使用repositoryService 
public class ActivitiDemo {
@Test
public void testDeployment(){
// 1.創建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.獲取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.使用service進行流程部署,定義一個流程的名字並把bmpn文件和png文件部署到數據庫中。
Deployment deploy = repositoryService.createDeployment()
.name("出差申請流程")
.addClasspathResource("bpmn/evection.bpmn")
.addClasspathResource("bpmn/evection.png")
.deploy();
// 4.輸出部署信息

System.out.println("流程部署id="+deploy.getId());
System.out.println("流程部署名字="+deploy.getName());



}
用zip文件批量部署,不指定部署名稱。
@Test
public void deployProcessByZip(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(new ZipInputStream(this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip"))).deploy();

System.out.println(deployment.getId());
System.out.println(deployment.getName());
}


有兩個表的新增操作需要說明一下:
ACT_RE_DEPLOYMENT:流程部署表,每部署一次會增加一條記錄
ACT_RE_PROCDEF,流程定義表,這兩個表是一對一的關系
ACT_GE_BYTEARRAY:流程資源表,剛才的bpmn和png就保存在這個,數據類型為BLOB二進制數據
9.啟動流程實例runtimeService.根據流程定義的key啟動
startProcessInstanceByKey("myProcess_1"),
操作的表:act_hi_actinst 流程實例執行歷史信息
     act_hi_identifylink 流程參與用於的歷史信息
    act_hi_procinst 流程任務的歷史信息
    act_hi_taskinst 流程任務的歷信息
    act_ru_execution 流程執行任務
    act_ru_identitylink 流程正在參與的用戶信息
    act_ru_task 流程當前任務信息



任務查詢:taskService.流程key+任務的負責人
createTaskQuery().processDefinitionKey("myProcess_1")
.taskAssignee("zhangsan")
.list();
任務完成
taskService.complete(task.getId());
10、Activiti架構、類關系
獲取proceEngine兩種方式:
  1.通過ProcessEngines.getDefaultProcessEngine();前提是配置文件名稱必須為activiti.cfg.xml,bean的名字必須為processEngineConfiguration
  2.通過ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration")
        .buildProcessEngine();可以指定配置文件的名稱還有bean的名稱

processEngine:流程引擎,用於獲取各種服務接口。
服務接口:用戶流程的部署,執行、管理,就是用這些接口操作對應的數據庫表
RepositoryService 資源管理類
RuntimeService 運行時管理類
TaskService 任務管理類
HistoryService 歷史任務管理類
ManagementService 流程引擎管理類
11.流程符號、畫流程圖
流程符號:時間event、活動Activity、網關GateWay、流向
使用流程設計器畫出流程圖
創建bpmn文件(本質就是xml文件,因為安裝了activitiBPM插件才能可視化操作流程內容),在流程設計器中使用流程符號來表達流程,指定流程的key,指定流程負責人
生成PNG文件:把bpmn文件后綴改為xml,在文件上右鍵選擇Diagrams=》showBPMN2.0 Desinger,打開創建,點擊導出文件類型選擇為png,要注意亂碼問題
12.activiti的api練習結束。實際工作中,需要把自己的業務表和Activiti的表進行關聯,才能真正完成實際的業務,是和Activiti表中的一個字段BusinessKey=1.

總結:
1.流程定義查詢:根據流程定義的key,查詢流程定義的信息
2.流程刪除,使用deployment刪除流程
3.流程資源下載,其他用戶想要查看流程的資源,可以把數據庫中的資源下載到本地
4.歷史信息查詢,HistoryService
5.流程定義和流程實例:一個流程定義可以對應多個流程實例。出差申請流程=流程定義,公司職員申請出差就是流程實例,例如小張,小李出差。
6.業務標識BusinessKey:可以查詢自己的業務表信息。(非act表)RuntimeService.startProcessInstanceByKey("definitionKey","BusinessKey")
7.掛起、激活實例:單個操作:操作流程實例,某個流程實例掛起后,則此流程不再繼續執行,使用RuntimeService.createProcessInstanceQuery,如果想完成該實例會報錯。
         全部實例操作:操作流程定義。流程定義掛起后,則不允許添加新的流程實例,同時該流程定義下的所有流程實例全部執行掛起。


Activiti流程變量數據類型:
  String,Integer,Short,long,double,boolean,binary,serializable,date.如果將pojo存儲到流程變量中,那么它必須實現序列化接口serializable,為了防止新增字段無法反序列化,需要生成serialVesionUID。
流程變量的使用方式(uel表達式:${}):在屬性上使用變量作為assignee,在連線上使用${day3>3決定流程走向}
流程變量作用域:一個流程實例,或者一個任務,一個執行實例,默認作用域為流程實例,當一個流程變量作用域為global的時候可以稱他為Global變量,global變量名不允許重復,設置相同名稱的變量,后面設置的會覆蓋前面設置的值。
        當作用域為任務或者是執行實例是流程變量稱之為local變量,作用域互不影響,變量名可以相同沒有影響。

如果分支連線沒有設置條件,會走sequenceFlow id=小的那一條線。

組任務流程定義的時候,看下xml文件里面有沒有指定assginee,指定了直接刪除掉,不然會報空
 
網關:排他網關ExcluesiveGateway:會走true的那條連線,如果多條連線都為true那么就走id較小的一條去執行,當條件都不滿足的時候會報錯,連線條件的是直接結束流程,這有一點不同。
   並行網關ParallelGateway:網關不會解析條件。所有的分支都會走,等到所有的分支都執行完成再匯聚,一般進一個出一個。
·   包含網關InclusiveGateway:會走為true的條件,和無條件始終為true的多條分支,
等到所有的分支都執行完成再匯聚,一般進一個出一個。


 事件網關:EventGateway:略  


整合略:
Activiti整合spring
Activiti整合springboot
activiti7會自動繼承springsecurity,activiti7會自動幫我們部署流程,前提就是bpmn文件放在resources下的processes文件中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM