Activiti工作流入门
1.什么是工作流
(1)工作流介紹
工作流(workflow),就是通過(guò)計(jì)算機(jī)對(duì)業(yè)務(wù)流程自動(dòng)化執(zhí)行管理。它主要解決的是"使在多個(gè)參與者之間按照某種預(yù)定義的規(guī)則自動(dòng)進(jìn)行傳遞文檔、信息或任務(wù)的過(guò)程,從而實(shí)現(xiàn)某個(gè)預(yù)期的業(yè)務(wù)目標(biāo)"。
(2)實(shí)現(xiàn)方式
在沒(méi)有專門的工作流引擎之前,我們之前為了實(shí)現(xiàn)流程控制,通常的做法就是采用狀態(tài)字段的值來(lái)跟蹤流程的變化情況。這樣不用角色的用戶,通過(guò)狀態(tài)字段的取值來(lái)決定記錄是否顯示。
針對(duì)有權(quán)限可以查看的記錄,當(dāng)前用戶根據(jù)自己的角色來(lái)決定審批是否合格的操作。如果合格將狀態(tài)字段設(shè)置一個(gè)值,來(lái)代表合格;當(dāng)然如果不合格也需要設(shè)置一個(gè)值來(lái)代表不合格的情況。
這是一種最為原始的方式。通過(guò)狀態(tài)字段雖然做到了流程控制,但是當(dāng)我們的流程發(fā)生變更的時(shí)候, 這種方式所編寫的代碼也要進(jìn)行調(diào)整。
那么有沒(méi)有專業(yè)的方式來(lái)實(shí)現(xiàn)工作流的管理呢?并且可以做到業(yè)務(wù)流程變化之后,我們的程序可以不用改變,如果可以實(shí)現(xiàn)這樣的效果,那么我們的業(yè)務(wù)系統(tǒng)的適應(yīng)能力就得到了極大提升。
2.activiti
Activiti 是一個(gè)工作流引擎, activiti 可以將業(yè)務(wù)系統(tǒng)中復(fù)雜的業(yè)務(wù)流程抽取出來(lái),使用專門的建模語(yǔ)言(BPMN2.0)進(jìn)行定義,業(yè)務(wù)系統(tǒng)按照預(yù)先定義的流程進(jìn)行執(zhí)行,實(shí)現(xiàn)了業(yè)務(wù)系統(tǒng)的業(yè)務(wù)流程由 activiti 進(jìn)行管理,減少業(yè)務(wù)系統(tǒng)由于流程變更進(jìn)行系統(tǒng)升級(jí)改造的工作量,從而提高系統(tǒng)的健壯性,同時(shí)也減少了系統(tǒng)開發(fā)維護(hù)成本。
官方網(wǎng)站:https://www.activiti.org/
(1)什么是BPMN
BPMN(Business Process Model And Notation)業(yè)務(wù)流程模型和符號(hào) 是由 BPMI(BusinessProcess Management Initiative)開發(fā)的一套標(biāo)準(zhǔn)的業(yè)務(wù)流程建模符號(hào),使用 BPMN 提供的符號(hào)可以創(chuàng)建業(yè)務(wù)流程。 2004 年 5 月發(fā)布了 BPMN1.0 規(guī)范。BPMI 于 2005 年 9 月并入 OMG(The Object Management Group 對(duì)象管理組織)組織。OMG 于 2011 年 1 月發(fā)布 BPMN2.0 的最終版本。
BPMN 是目前被各 BPM 廠商廣泛接受的 BPM 標(biāo)準(zhǔn)。Activiti 就是使用 BPMN 2.0 進(jìn)行流程建模、流程執(zhí)行管理,它包括很多的建模符號(hào)。
?
一個(gè) bpmn 圖形的例子: 首先當(dāng)事人發(fā)起一個(gè)請(qǐng)假單; 其次他所在部門的經(jīng)理對(duì)請(qǐng)假單進(jìn)行審核; 然后人事經(jīng)理進(jìn)行復(fù)核并進(jìn)行備案; 最后請(qǐng)假流程結(jié)束。
?
Bpmn 圖形其實(shí)是通過(guò) xml 表示業(yè)務(wù)流程。通過(guò)將bpmn流程圖后綴修改為xml,可以看到具體內(nèi)容。
(2)Activiti支持的數(shù)據(jù)庫(kù)
?
3.在java中使用activiti
本次使用activiti7+IDEA開發(fā)工具
注:activiti7需要安裝actiBPM插件
(1)創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;(2)導(dǎo)入依賴
創(chuàng)建maven項(xiàng)目,導(dǎo)入相關(guān)依賴
?
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/學(xué)習(xí)/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"> ?<!-- 數(shù)據(jù)源配置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單獨(dú)運(yùn)行的ProcessEngine配置對(duì)象(processEngineConfiguration),使用單獨(dú)啟動(dòng)方式默認(rèn)情況下:bean的id=processEngineConfiguration--><bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!-- 代表數(shù)據(jù)源 --><property name="dataSource" ref="dataSource"></property> ?<!-- 如果不使用上面的bean配置數(shù)據(jù)源,也可以使用如下方法配置數(shù)據(jù)源 --><!-- <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" />--> ?<!-- 代表是否生成表結(jié)構(gòu) --><property name="databaseSchemaUpdate" value="true"/></bean> </beans>databaseSchemaUpdate參數(shù):
false(默認(rèn)):檢查數(shù)據(jù)庫(kù)表的版本和依賴庫(kù)的版本, 如果版本不匹配就拋出異常。
true: 構(gòu)建流程引擎時(shí),執(zhí)行檢查,如果需要就執(zhí)行更新。 如果表不存在,就創(chuàng)建。
create-drop: 構(gòu)建流程引擎時(shí)創(chuàng)建數(shù)據(jù)庫(kù)表, 關(guān)閉流程引擎時(shí)刪除這些表。
drop-create:先刪除表再創(chuàng)建表。
create: 構(gòu)建流程引擎時(shí)創(chuàng)建數(shù)據(jù)庫(kù)表, 關(guān)閉流程引擎時(shí)不刪除這些表。
(4)編寫測(cè)試代碼
ActivitiTest.java
/*** 測(cè)試類:* 測(cè)試所需要的activiti的25張表的生成*/ public class ActivitiTest { ?@Testpublic void testGenTable() {//1.創(chuàng)建ProcessEngineConfiguration對(duì)象ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");//2.創(chuàng)建ProcessEngine對(duì)象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);} ? }運(yùn)行完代碼之后可以發(fā)現(xiàn)配置的數(shù)據(jù)庫(kù)中生成了25張表。
4.activiti詳解
(1)數(shù)據(jù)庫(kù)
?
數(shù)據(jù)庫(kù)表的命名規(guī)則:
Activiti 的表都以 ACT_開頭。 第二部分是表示表的用途的兩個(gè)字母標(biāo)識(shí)。 用途也和服務(wù)的 API 對(duì)應(yīng)。
-
ACT_RE_*: 'RE'表示 repository。 這個(gè)前綴的表包含了流程定義和流程靜態(tài)資源 (圖片, 規(guī)則,等等)。
-
ACT_RU_*: 'RU'表示 runtime。 這些運(yùn)行時(shí)的表,包含流程實(shí)例,任務(wù),變量,異步任務(wù), 等運(yùn)行中的數(shù)據(jù)。 Activiti 只在流程實(shí)例執(zhí)行過(guò)程中保存這些數(shù)據(jù), 在流程結(jié)束時(shí)就會(huì)刪除這些記錄。 這樣運(yùn)行時(shí)表可以一直很小速度很快。
-
ACT_HI_*: 'HI'表示 history。 這些表包含歷史數(shù)據(jù),比如歷史流程實(shí)例, 變量,任務(wù)等。
-
ACT_GE_*: GE 表示 general。通用數(shù)據(jù), 用于不同場(chǎng)景下。
(2)activiti.cfg.xml
activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定義、數(shù)據(jù)源定義、事務(wù)管理器等,此文件其實(shí)就是一個(gè) spring 配置文件。
(3)ProcessEngineConfiguration
流程引擎的配置類,通過(guò) ProcessEngineConfiguration 可以創(chuàng)建工作流引擎 ProceccEngine。
(4)ProcessEngine
工作流引擎,相當(dāng)于一個(gè)門面接口,通過(guò) ProcessEngineConfiguration 創(chuàng)建 processEngine,通過(guò)ProcessEngine 創(chuàng)建各個(gè) service 接口。
(5)Service
通過(guò) ProcessEngine 創(chuàng)建 Service,Service 是工作流引擎提供用于進(jìn)行工作流部署、執(zhí)行、管理的服務(wù)接口。
-
RepositoryService
是 activiti 的資源管理類,提供了管理和控制流程發(fā)布包和流程定義的操作。使用工作流建模工具設(shè)計(jì)的業(yè)務(wù)流程圖需要使用此 service 將流程定義文件的內(nèi)容部署到計(jì)算機(jī)。
除了部署流程定義以外還可以:
查詢引擎中的發(fā)布包和流程定義。
暫停或激活發(fā)布包,對(duì)應(yīng)全部和特定流程定義。 暫停意味著它們不能再執(zhí)行任何操作了,激活是對(duì)應(yīng)的反向操作。
獲得多種資源,像是包含在發(fā)布包里的文件, 或引擎自動(dòng)生成的流程圖。 獲得流程定義的pojo版本,可以用來(lái)通過(guò) java 解析流程,而不必通過(guò) xml。
-
RuntimeService
它是 activiti 的流程運(yùn)行管理類。可以從這個(gè)服務(wù)類中獲取很多關(guān)于流程執(zhí)行相關(guān)的信息
-
TaskService
是 activiti 的任務(wù)管理類。可以從這個(gè)類中獲取任務(wù)的信息。
-
HistoryService
是 activiti 的歷史管理類,可以查詢歷史信息,執(zhí)行流程時(shí),引擎會(huì)保存很多數(shù)據(jù)(根據(jù)配置),比如流程實(shí)例啟動(dòng)時(shí)間,任務(wù)的參與者, 完成任務(wù)的時(shí)間,每個(gè)流程實(shí)例的執(zhí)行路徑,等等。 這個(gè)服務(wù)主要通過(guò)查詢功能來(lái)獲得這些數(shù)據(jù)。
-
ManagementService
是activiti的引擎管理類,提供了對(duì) Activiti 流程引擎的管理和維護(hù)功能,這些功能不在工作流驅(qū)動(dòng)的應(yīng)用程序中使用,主要用于 Activiti 系統(tǒng)的日常維護(hù)。
總結(jié)
以上是生活随笔為你收集整理的Activiti工作流入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring自定义注解+redis实现接
- 下一篇: Activiti工作流之实现一个简单的流