Activiti工作流入门
1.什么是工作流
(1)工作流介紹
工作流(workflow),就是通過計算機對業務流程自動化執行管理。它主要解決的是"使在多個參與者之間按照某種預定義的規則自動進行傳遞文檔、信息或任務的過程,從而實現某個預期的業務目標"。
(2)實現方式
在沒有專門的工作流引擎之前,我們之前為了實現流程控制,通常的做法就是采用狀態字段的值來跟蹤流程的變化情況。這樣不用角色的用戶,通過狀態字段的取值來決定記錄是否顯示。
針對有權限可以查看的記錄,當前用戶根據自己的角色來決定審批是否合格的操作。如果合格將狀態字段設置一個值,來代表合格;當然如果不合格也需要設置一個值來代表不合格的情況。
這是一種最為原始的方式。通過狀態字段雖然做到了流程控制,但是當我們的流程發生變更的時候, 這種方式所編寫的代碼也要進行調整。
那么有沒有專業的方式來實現工作流的管理呢?并且可以做到業務流程變化之后,我們的程序可以不用改變,如果可以實現這樣的效果,那么我們的業務系統的適應能力就得到了極大提升。
2.activiti
Activiti 是一個工作流引擎, activiti 可以將業務系統中復雜的業務流程抽取出來,使用專門的建模語言(BPMN2.0)進行定義,業務系統按照預先定義的流程進行執行,實現了業務系統的業務流程由 activiti 進行管理,減少業務系統由于流程變更進行系統升級改造的工作量,從而提高系統的健壯性,同時也減少了系統開發維護成本。
官方網站:https://www.activiti.org/
(1)什么是BPMN
BPMN(Business Process Model And Notation)業務流程模型和符號 是由 BPMI(BusinessProcess Management Initiative)開發的一套標準的業務流程建模符號,使用 BPMN 提供的符號可以創建業務流程。 2004 年 5 月發布了 BPMN1.0 規范。BPMI 于 2005 年 9 月并入 OMG(The Object Management Group 對象管理組織)組織。OMG 于 2011 年 1 月發布 BPMN2.0 的最終版本。
BPMN 是目前被各 BPM 廠商廣泛接受的 BPM 標準。Activiti 就是使用 BPMN 2.0 進行流程建模、流程執行管理,它包括很多的建模符號。
?
一個 bpmn 圖形的例子: 首先當事人發起一個請假單; 其次他所在部門的經理對請假單進行審核; 然后人事經理進行復核并進行備案; 最后請假流程結束。
?
Bpmn 圖形其實是通過 xml 表示業務流程。通過將bpmn流程圖后綴修改為xml,可以看到具體內容。
(2)Activiti支持的數據庫
?
3.在java中使用activiti
本次使用activiti7+IDEA開發工具
注:activiti7需要安裝actiBPM插件
(1)創建數據庫
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;(2)導入依賴
創建maven項目,導入相關依賴
?
pom.xml
?<properties><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version></properties> ?<dependencies> ?<dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>7.0.0.Beta1</version></dependency> ?<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>7.0.0.Beta1</version></dependency> ?<dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-model</artifactId><version>7.0.0.Beta1</version></dependency> ?<dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-converter</artifactId><version>7.0.0.Beta1</version></dependency> ?<dependency><groupId>org.activiti</groupId><artifactId>activiti-json-converter</artifactId><version>7.0.0.Beta1</version></dependency> ?<dependency><groupId>org.activiti</groupId><artifactId>activiti-bpmn-layout</artifactId><version>7.0.0.Beta1</version></dependency> ?<dependency><groupId>org.activiti.cloud</groupId><artifactId>activiti-cloud-services-api</artifactId><version>7.0.0.Beta1</version></dependency> ?<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.40</version></dependency> ?<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency> ?<!-- log start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- log end --> ?<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency> ?<dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><!--文件讀寫操作--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.0</version></dependency></dependencies>(3)配置文件
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE ? ? ? ? ? debug ? info ? warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE ? # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE ? # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m ? # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=/Users/apple/學習/study/activity/activity_01/xis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %mactiviti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> ?<!-- 數據源配置dbcp --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/activiti" /><property name="username" value="root" /><property name="password" value="root" /></bean><!-- activiti單獨運行的ProcessEngine配置對象(processEngineConfiguration),使用單獨啟動方式默認情況下:bean的id=processEngineConfiguration--><bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!-- 代表數據源 --><property name="dataSource" ref="dataSource"></property> ?<!-- 如果不使用上面的bean配置數據源,也可以使用如下方法配置數據源 --><!-- <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" /><property name="jdbcUsername" value="root" /><property name="jdbcPassword" value="root" />--> ?<!-- 代表是否生成表結構 --><property name="databaseSchemaUpdate" value="true"/></bean> </beans>databaseSchemaUpdate參數:
false(默認):檢查數據庫表的版本和依賴庫的版本, 如果版本不匹配就拋出異常。
true: 構建流程引擎時,執行檢查,如果需要就執行更新。 如果表不存在,就創建。
create-drop: 構建流程引擎時創建數據庫表, 關閉流程引擎時刪除這些表。
drop-create:先刪除表再創建表。
create: 構建流程引擎時創建數據庫表, 關閉流程引擎時不刪除這些表。
(4)編寫測試代碼
ActivitiTest.java
/*** 測試類:* 測試所需要的activiti的25張表的生成*/ public class ActivitiTest { ?@Testpublic void testGenTable() {//1.創建ProcessEngineConfiguration對象ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");//2.創建ProcessEngine對象ProcessEngine processEngine = configuration.buildProcessEngine();System.out.println(processEngine);} ?@Testpublic void testGenTable2() {//使用下面這種方式生成表的條件//1.activiti配置文件名稱必須為activiti.cfg.xml//2.bean的id必須為"processEngineConfiguration"ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();System.out.println(defaultProcessEngine);} ? }運行完代碼之后可以發現配置的數據庫中生成了25張表。
4.activiti詳解
(1)數據庫
?
數據庫表的命名規則:
Activiti 的表都以 ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的 API 對應。
-
ACT_RE_*: 'RE'表示 repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片, 規則,等等)。
-
ACT_RU_*: 'RU'表示 runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務, 等運行中的數據。 Activiti 只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
-
ACT_HI_*: 'HI'表示 history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等。
-
ACT_GE_*: GE 表示 general。通用數據, 用于不同場景下。
(2)activiti.cfg.xml
activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定義、數據源定義、事務管理器等,此文件其實就是一個 spring 配置文件。
(3)ProcessEngineConfiguration
流程引擎的配置類,通過 ProcessEngineConfiguration 可以創建工作流引擎 ProceccEngine。
(4)ProcessEngine
工作流引擎,相當于一個門面接口,通過 ProcessEngineConfiguration 創建 processEngine,通過ProcessEngine 創建各個 service 接口。
(5)Service
通過 ProcessEngine 創建 Service,Service 是工作流引擎提供用于進行工作流部署、執行、管理的服務接口。
-
RepositoryService
是 activiti 的資源管理類,提供了管理和控制流程發布包和流程定義的操作。使用工作流建模工具設計的業務流程圖需要使用此 service 將流程定義文件的內容部署到計算機。
除了部署流程定義以外還可以:
查詢引擎中的發布包和流程定義。
暫停或激活發布包,對應全部和特定流程定義。 暫停意味著它們不能再執行任何操作了,激活是對應的反向操作。
獲得多種資源,像是包含在發布包里的文件, 或引擎自動生成的流程圖。 獲得流程定義的pojo版本,可以用來通過 java 解析流程,而不必通過 xml。
-
RuntimeService
它是 activiti 的流程運行管理類。可以從這個服務類中獲取很多關于流程執行相關的信息
-
TaskService
是 activiti 的任務管理類。可以從這個類中獲取任務的信息。
-
HistoryService
是 activiti 的歷史管理類,可以查詢歷史信息,執行流程時,引擎會保存很多數據(根據配置),比如流程實例啟動時間,任務的參與者, 完成任務的時間,每個流程實例的執行路徑,等等。 這個服務主要通過查詢功能來獲得這些數據。
-
ManagementService
是activiti的引擎管理類,提供了對 Activiti 流程引擎的管理和維護功能,這些功能不在工作流驅動的應用程序中使用,主要用于 Activiti 系統的日常維護。
總結
以上是生活随笔為你收集整理的Activiti工作流入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring自定义注解+redis实现接
- 下一篇: Activiti工作流之实现一个简单的流