【青铜打铁篇】Activiti 工作流从入门到入土?
點擊上方“好好學java”,選擇“置頂”公眾號
重磅資源、干貨,第一時間送達
?重磅推薦?
① 純福利 | 公眾號資源大匯總,一年才一次!
② 重磅!!2018年Java全套入門到進階學習視頻及項目實戰(zhàn)
③?2018年java架構師學習視頻教程資源
④ 源碼系列!!spring源碼深度解析
文章源碼托管:https://github.com/OUYANGSIHAI/Activiti-learninig
歡迎 star !!!
本文由自己原創(chuàng)的多篇博客組成,不足之處,還請多多指正。
一、activiti介紹
Activiti5是由Alfresco軟件在2010年5月17日發(fā)布的業(yè)務流程管理(BPM)框架,它是覆蓋了業(yè)務流程管理、工作流、服務協(xié)作等領域的一個開源的、靈活的、易擴展的可執(zhí)行流程語言框架。Activiti基于Apache許可的開源BPM平臺,創(chuàng)始人Tom Baeyens是JBoss jBPM的項目架構師,它特色是提供了eclipse插件,開發(fā)人員可以通過插件直接繪畫出業(yè)務流程圖。
-
官網:
http://www.activiti.org/
-
下載:
http://www.activiti.org/download.html
目前,Activiti5中的5.22版本是用的最多的一個版本,本次教程也是使用這個版本進行講解,最新版本到了7.0版本。
在開始教程之前,我們需要先明確下面的一些概念和知識,可以幫助我們更好的理解工作流的開發(fā)。
二、工作流引擎
ProcessEngine對象,這是Activiti工作的核心。負責生成流程運行時的各種實例及數(shù)據、監(jiān)控和管理流程的運行。
用百度更為通俗的話來說就是:就是一輛汽車的發(fā)動機,就好比一輛汽車,外表做得再漂亮,如果發(fā)動機有問題就只是一個擺設。應用系統(tǒng)的彈性就好比引擎轉速方面的性能,加速到100 公里需要1 個小時(業(yè)務流程發(fā)生變動需要進行半年的程序修改)還能叫好車嗎?引擎動不動就熄火(程序因為邏輯的問題陷入死循環(huán))的車還敢開嗎?
三、BPMN
在Activiti工作流中用到了一個BPMN的文件,主要是用來描述業(yè)務流程的基本的符號,利用各個組件能夠組成一個業(yè)務流程圖,整個業(yè)務也是根據這個圖來走的,其實用xml格式打開,就是一個xml文件。
下面就是bpmn組件的示意圖
圖片.png四、數(shù)據庫
在我們進行業(yè)務流程開發(fā)的時候,是會產生很多的數(shù)據的,那么這些數(shù)據都是放在哪里呢?
是的,其實就是存放在數(shù)據庫的。
在Activiti工作流的后臺是有數(shù)據庫的支持的,所有的表都以ACT_開頭,利用這些數(shù)據庫的表,就能夠把整個業(yè)務流程的數(shù)據保存下來,然后利用這些數(shù)據進行不同的業(yè)務的開發(fā)。
數(shù)據庫表示意圖
圖片.png下面對這些表做一些基本的解釋,這些可以先不看,等看完后面的教程后再回過頭來看,你會發(fā)現(xiàn)其實很簡單的。
-
資源庫流程規(guī)則表
1)act_re_deployment ? ? 部署信息表
2)act_re_model ? ? ? ? ?流程設計模型部署表
3)act_re_procdef ? ? ? ? ?流程定義數(shù)據表
-
運行時數(shù)據庫表
1)act_ru_execution ? ? ? ?運行時流程執(zhí)行實例表
2)act_ru_identitylink ? ? ? ?運行時流程人員表,主要存儲任務節(jié)點與參與者的相關信息
3)act_ru_task ? ? ? ? ? ?運行時任務節(jié)點表
4)act_ru_variable ? ? ? ?運行時流程變量數(shù)據表
-
歷史數(shù)據庫表
1)act_hi_actinst ? ? ? ? 歷史節(jié)點表
2)act_hi_attachment ? ? ? ?歷史附件表
3)act_hi_comment ? ? ? ?歷史意見表
4)act_hi_identitylink ? ? ? ?歷史流程人員表
5)act_hi_detail ? ? ? ? ? ?歷史詳情表,提供歷史變量的查詢
6)act_hi_procinst ? ? ? ?歷史流程實例表
7)act_hi_taskinst ? ? ? ?歷史任務實例表
8)act_hi_varinst ? ? ? ? ? ?歷史變量表
-
組織機構表
1)act_id_group ? ? ? ?用戶組信息表
2)act_id_info ? ? ? ? ? ?用戶擴展信息表
3)act_id_membership ? ?用戶與用戶組對應信息表
4)act_id_user ? ? ? ? ? ?用戶信息表
這些表用的很少,因為我們一般會自己做一個權限管理,所以不會用activiti自身所帶的表。
-
通用數(shù)據表
1)act_ge_bytearray ? ? ? ?二進制數(shù)據表
2)act_ge_property ? ? ? ? ? ?屬性數(shù)據表存儲整個流程引擎級別的數(shù)據,初始化表結構時,會默認插入三條記錄。
這兩張表的數(shù)據是不能夠隨意刪除的,刪除可能會出問題。
五、總結
工作流的概念就先介紹這么多了,更多的去官網查看,下一節(jié)將用一個入門的實例來對工作流進行講解。
一、前言
在上一節(jié)中我們對activiti進行了基本的介紹activiti進行了基本的介紹,同時介紹了基本的概念。
這一節(jié),我將用一個入門程序,介紹如何使用activiti。
二、環(huán)境準備
2.1、編譯器選擇
這里我們使用Idea進行工作流開發(fā),雖然Idea對于工作流的友好度不是很好,因為會有一些小的bug,但是,Idea對于Java的開發(fā)還是非常的好的。
在用Idea開發(fā)之前,我們需要在idea中安裝bpmn開發(fā)的插件。方法如下
打開設置
圖片.png選擇plugins
圖片.png搜索actiBPM
圖片.png重啟idea,新建文件
如果能夠找到下面的創(chuàng)建方法,就代表成功了。
圖片.png新建后出現(xiàn)下面的編輯頁面
圖片.png到現(xiàn)在,bpmn編輯插件就準備好了。
2.2、其他環(huán)境準備
-
JDK:1.8
-
數(shù)據庫:mysql5.7
-
activiti jar包:使用maven依賴
三、入門程序
3.1、新建maven項目
新建的maven項目目錄如下
圖片.png3.2、添加pom依賴
這里需要的pom依賴有以下幾個:junit、druid、mysql、lombok(日志)、activiti
<?xml?version="1.0"?encoding="UTF-8"?><project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sihai</groupId><artifactId>acitvitiDemo</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!--?druid?--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><!--?mysql?--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version></dependency><!--?lombok?--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.12</version></dependency><!--?logback?--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.1.8</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.8</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.22</version></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>5.22.0</version></dependency></dependencies><build><pluginManagement><!--?lock?down?plugins?versions?to?avoid?using?Maven?defaults?(may?be?moved?to?parent?pom)?--><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></pluginManagement></build> </project>3.3、日志配置文件
<?xml?version="1.0"?encoding="UTF-8"?> <configuration?scan="true"?scanPeriod="60?seconds"><appender?name="STDOUT"?class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd?HH:mm:ss.SSS}?[%thread]?%-5level?%logger?-?%msg%n</pattern></encoder></appender><!--<appender?name="permission"?class="ch.qos.logback.core.rolling.RollingFileAppender">--><!--<file>${catalina.home}/logs/permission.log</file>--><!--<rollingPolicy?class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">--><!--<FileNamePattern>${catalina.home}/logs/permission.%d{yyyy-MM-dd}.log.gz</FileNamePattern>--><!--</rollingPolicy>--><!--<layout?class="ch.qos.logback.classic.PatternLayout">--><!--<pattern>%d{yyyy-MM-dd?HH:mm:ss.SSS}?[%thread]?%-5level?%logger?-?%msg%n</pattern>--><!--</layout>--><!--</appender>--><!----><!--<logger?name="xxx"?level="INFO">--><!--<appender-ref?ref="permission"/>--><!--</logger>--><!--?TRACE?<?DEBUG?<?INFO?<?WARN?<?ERROR?--><root?level="INFO"><appender-ref?ref="STDOUT"/></root></configuration>3.4、測試實例
下面是添加一個junit測試實例,通過測試生成activiti底層需要的數(shù)據庫表,總共有25張,如果數(shù)據庫生成了25張表結構,則說明成功!
/***?@Author?ouyangsihai*?@Description?生成activiti底層數(shù)據庫表結構*?@Date?16:24?2019/1/26*?@Param*?@return**/ public?class?Activiti_01?{/***?@return?void*?@Author?ouyangsihai*?@Description?//生成數(shù)據庫表結構*?@Date?20:57?2018/12/5*?@Param?[]**/@Testpublic?void?test_createDatabase()?{//?創(chuàng)建流程引擎配置信息對象ProcessEngineConfiguration?pec?=?ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();//?設置數(shù)據庫的類型pec.setDatabaseType("mysql");//?設置創(chuàng)建數(shù)據庫的方式 //????????ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE(true);//如果沒有數(shù)據庫表就會創(chuàng)建數(shù)據庫表,有的話就修改表結構.//?ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE(false):?不會創(chuàng)建數(shù)據庫表//?ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP(create-drop):?先創(chuàng)建、再刪除.pec.setDatabaseSchemaUpdate("true");//?設置數(shù)據庫驅動pec.setJdbcDriver("com.mysql.jdbc.Driver");//?設置jdbcURLpec.setJdbcUrl("jdbc:mysql://localhost:3306/activitiTest?useUnicode=true&characterEncoding=UTF-8");//?設置用戶名pec.setJdbcUsername("root");//?設置密碼pec.setJdbcPassword("root");pec.setJdbcPassword("XXXX");//?構建流程引擎對象ProcessEngine?pe?=?pec.buildProcessEngine();?//?調用訪方法才會創(chuàng)建數(shù)據表//?調用close方法時,才會刪除pe.close();} }3.5、運行測試實例
運行上面的測試實例后,將會生成下面的25張表結構。
日志信息
圖片.png表結構
圖片.png四、總結
通過上面是入門實例,就將activiti的環(huán)境準備好了!
一、前言
在上一節(jié)中,通過一個入門程序,把activiti的環(huán)境準備好了,這一節(jié),將整合spring,并且部署一個最簡單的bpmn流程圖。
二、環(huán)境準備
這一節(jié)的內容在上一節(jié)入門程序的基礎上進行環(huán)境配置,如果需要完整的配置文件,請到上一節(jié)查看。
2.1 spring配置
首先,需要添加spring的配置文件
<?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tx="http://www.springframework.org/schema/tx"?xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd?????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx.xsd"><bean?id="propertyConfigurer"?class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property?name="ignoreUnresolvablePlaceholders"?value="true"/><property?name="locations"><list><value>classpath:settings.properties</value></list></property></bean><bean?id="dataSource"?class="com.alibaba.druid.pool.DruidDataSource"?init-method="init"?destroy-method="close"><property?name="driverClassName"?value="${db.driverClassName}"/><property?name="url"?value="${db.url}"/><property?name="username"?value="${db.username}"/><property?name="password"?value="${db.password}"/><property?name="initialSize"?value="3"/><property?name="minIdle"?value="3"/><property?name="maxActive"?value="20"/><property?name="maxWait"?value="60000"/><property?name="filters"?value="stat,wall"/></bean><!--?tx?--><bean?id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property?name="dataSource"?ref="dataSource"/></bean><tx:annotation-driven?transaction-manager="transactionManager"/><!--?druid?--><bean?id="stat-filter"?class="com.alibaba.druid.filter.stat.StatFilter"><property?name="slowSqlMillis"?value="3000"/><property?name="logSlowSql"?value="true"/><property?name="mergeSql"?value="true"/></bean><bean?id="wall-filter"?class="com.alibaba.druid.wall.WallFilter"><property?name="dbType"?value="mysql"/></bean></beans>2.2 數(shù)據庫等環(huán)境配置文件
然后,添加數(shù)據庫等環(huán)境配置文件
db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/activitiTest?useUnicode=true&characterEncoding=UTF-8 db.username=root db.password=root到目前為止,就把spring的配置環(huán)境搭建好了,接下來,我們需要加入activiti的整合環(huán)境的配置了。
2.3 spring整合activiti
這一步,我們加入spring整合activiti環(huán)境的配置
<?xml?version="1.0"?encoding="UTF-8"?> <beans?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd"><!--?配置流程引擎配置信息對象?--><bean?id="processEngineConfiguration"?class="org.activiti.spring.SpringProcessEngineConfiguration"p:dataSource-ref="dataSource"p:transactionManager-ref="transactionManager"p:databaseSchemaUpdate="true"p:jobExecutorActivate="false"p:databaseType="mysql"p:activityFontName="宋體"p:labelFontName="黑體"p:xmlEncoding="utf-8"/><!--?配置流程引擎?--><bean?id="processEngine"?class="org.activiti.spring.ProcessEngineFactoryBean"p:processEngineConfiguration-ref="processEngineConfiguration"/><!--?配置六個服務Bean?--><bean?id="repositoryService"?factory-bean="processEngine"factory-method="getRepositoryService"/><bean?id="runtimeService"?factory-bean="processEngine"factory-method="getRuntimeService"/><bean?id="taskService"?factory-bean="processEngine"factory-method="getTaskService"/><bean?id="historyService"?factory-bean="processEngine"factory-method="getHistoryService"/><bean?id="formService"?factory-bean="processEngine"factory-method="getFormService"/><bean?id="identityService"?factory-bean="processEngine"factory-method="getIdentityService"/></beans>到2.3這一步,spring整合activiti的環(huán)境就配置好了,接下來,我們創(chuàng)建一個簡單的bpmn文件,然后,做一個簡單的測試,部署bpmn文件。
三、部署實例
3.1 繪制
打開idea的bpmn編輯器,繪制一個簡單的bpmn文件,如下
圖片.png注意: 用idea編輯的時候,是不會和eclipse一樣會自動的生成png文件的,這里有兩種方式解決。
方式一
用eclipse打開編輯,會自動生成,這個簡單,這里就不多說了。
方式二
將bpmn后綴改為xml
圖片.png右鍵xml文件,找到下面的按鍵
圖片.png出現(xiàn)下面的界面
圖片.png右鍵,選擇export to file
圖片.png生成如下
圖片.png最后將xml后綴改為bpmn
3.2 測試
通過上面的介紹,繪制了bpmn文件和png圖片,下面寫一個測試實例,部署流程。
/***?@Author?歐陽思海*?@Description?部署*?@Date?16:24?2019/1/26*?@Param*?@return**/ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations?=?{"classpath:applicationContext-core.xml","classpath:applicationContext-activiti.xml" }) @Slf4j public?class?test02_spring?{@Autowiredprivate?ProcessEngine?processEngine;@Autowiredprivate?TaskService?taskService;@Autowiredprivate?RuntimeService?runtimeService;@Autowiredprivate?HistoryService?historyService;/***?@return?void*?@Author?歐陽思海*?@Description?部署流程實例*?@Date?16:17?2018/12/19*?@Param?[]**/@Testpublic?void?testTask()?throws?Exception?{//?1?發(fā)布流程InputStream?inputStreamBpmn?=?this.getClass().getResourceAsStream("/bpmn/test_01.xml");InputStream?inputStreamPng?=?this.getClass().getResourceAsStream("/bpmn/test_01.png");processEngine.getRepositoryService().createDeployment().addInputStream("test_01.xml",?inputStreamBpmn).addInputStream("test_01.png",?inputStreamPng).deploy();ProcessInstance?pi?=?processEngine.getRuntimeService()//.startProcessInstanceByKey("test_01");System.out.println("pid:"?+?pi.getId());} }注意上面的test_01是你的bpmn文件的id。
3.3 測試結果
圖片.png四、總結
這一節(jié)通過整合spring,繪制簡單的bpmn文件,然后成功部署了bpmn文件。下一節(jié),將講解activit的API
你「在看」嗎?????
????點擊「閱讀原文」,更多精彩
總結
以上是生活随笔為你收集整理的【青铜打铁篇】Activiti 工作流从入门到入土?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java8 之 lambda 表达式、方
- 下一篇: 一定是你想要的微服务资源springbo