本文就不對activiti做解釋,下面直接看項目集成
以下順序方面根據我的理解來,可以先從第二章看,再看第一張與第三章
增加activiti表的API,備注用。
目錄
1.2. 創建啟動類(componentScan是自己項目持久化模板,可以直接刪掉)
一、springboot2.X集成activiti
1.1. 引入jar包
-
<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>
-
-
<artifactId>enn-activiti
</artifactId>
-
-
-
<groupId>enn.activiti
</groupId>
-
<version>1.1.1-SNAPSHOT
</version>
-
<packaging>jar
</packaging>
-
-
<parent>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-parent
</artifactId>
-
<version>2.0.4.RELEASE
</version>
-
</parent>
-
-
<dependencies>
-
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-web
</artifactId>
-
<exclusions>
-
<exclusion>
-
<groupId>org.hibernate.validator
</groupId>
-
<artifactId>hibernate-validator
</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>org.apache.logging.log4j
</groupId>
-
<artifactId>log4j-to-slf4j
</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>org.slf4j
</groupId>
-
<artifactId>jul-to-slf4j
</artifactId>
-
</exclusion>
-
<exclusion>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-tomcat
</artifactId>
-
</exclusion>
-
</exclusions>
-
</dependency>
-
-
-
<dependency>
-
<groupId>org.activiti
</groupId>
-
<artifactId>activiti-spring-boot-starter-basic
</artifactId>
-
<version>6.0.0
</version>
-
<exclusions>
-
<exclusion>
-
<groupId>javax.persistence
</groupId>
-
<artifactId>persistence-api
</artifactId>
-
</exclusion>
-
-
</exclusions>
-
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-data-jpa
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-thymeleaf
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-starter-test
</artifactId>
-
<scope>test
</scope>
-
</dependency>
-
-
-
-
</dependencies>
-
-
<profiles>
-
<profile>
-
<id>local
</id>
-
<properties>
-
<spring.profiles.active>local
</spring.profiles.active>
-
</properties>
-
<activation>
-
<activeByDefault>true
</activeByDefault>
-
</activation>
-
</profile>
-
<profile>
-
<id>dev
</id>
-
<properties>
-
<spring.profiles.active>dev
</spring.profiles.active>
-
</properties>
-
</profile>
-
-
</profiles>
-
-
<build>
-
<finalName>enn-activiti
</finalName>
-
<plugins>
-
<plugin>
-
<groupId>org.apache.maven.plugins
</groupId>
-
<artifactId>maven-compiler-plugin
</artifactId>
-
<configuration>
-
<source>${java.version}
</source>
-
<target>${java.version}
</target>
-
</configuration>
-
</plugin>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
<plugin>
-
<groupId>org.apache.maven.plugins
</groupId>
-
<artifactId>maven-surefire-plugin
</artifactId>
-
<configuration>
-
<skip>true
</skip>
-
<testFailureIgnore>true
</testFailureIgnore>
-
</configuration>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
1.2. 創建啟動類(componentScan是自己項目持久化模板,可以直接刪掉)
-
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
-
@ComponentScan(basePackages = {"enn.activiti","enn.base.redis.cluster",
-
"enn.base.utils","enn.base.mysql.ordinary","enn.base.mysql.dao"})
-
@EnableAsync
-
-
public class Application {
-
-
static ConfigurableApplicationContext applicationContext;
-
-
public static void main(String[] args) {
-
applicationContext = SpringApplication.run(Application.class, args);
-
}
}
1.3. 配置application.yml
-
# \u670D\u52A1\u7AEF\u53E3
-
server:
-
port: ${SERVER_PORT:8082}
-
-
#\u6570\u636E\u5E93\u94FE\u63A5\u914D\u7F6E
-
spring:
-
datasource:
-
name: ecityposition
-
type: com.alibaba.druid.pool.DruidDataSource
-
filters: stat
-
url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8
-
driver-class-name: com.mysql.jdbc.Driver
-
username: root
-
password: root
-
-
#配置初始化大小/最小/最大
-
initial-size: 1
-
min-idle: 1
-
max-active: 20
-
#獲取連接等待超時時間
-
max-wait: 60000
-
#間隔多久進行一次檢測,檢測需要關閉的空閑連接
-
time-between-eviction-runs-millis: 60000
-
#一個連接在池中最小生存的時間
-
min-evictable-idle-time-millis: 300000
-
validation-query: SELECT 'x'
-
test-while-idle: true
-
test-on-borrow: false
-
test-on-return: false
-
#打開PSCache,並指定每個連接上PSCache的大小。oracle設為true,mysql設為false。分庫分表較多推薦設置為false
-
pool-prepared-statements: false
-
max-pool-prepared-statement-per-connection-size: 20
-
jpa:
-
properties:
-
hibernate:
-
hbm2ddl:
-
auto: update
-
jackson:
-
date-format: yyyy-MM-dd HH:mm:ss
-
time-zone: GMT+8
-
-
-
-
activiti:
-
check-process-definitions: false
-
database-schema-update: true
1.4. 啟動可能出現的錯誤
上述已經解決,直接啟動沒有問題
1.4.1 如果項目使用myibatis,則需要再依賴中排除persistence-api,否則會以下的錯誤:
Consider defining a bean of type 'javax.persistence.EntityManagerFactory' in your configuration.
1.4.2 在配置文件中設置不掃描processes文件包
如果還沒有建bpmn模型,則會出現如下錯誤:
java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist
另外,database-schema-update屬性,可選值為: false,true,create-drop,drop-create,默認為true。
為true表示activiti會對數據庫中的表進行更新操作,如果不存在,則進行創建。
1.4.3 在啟動類上排除SecurityAutoConfiguration類,否則報:
java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
因為GlobalAuthenticationConfigurerAdapter 是spring-boot-starter-security 依賴中的屬於安全配置類, 而 引入的activiti-spring-boot-starter-basic 依賴中存在了一個自動安全配置類, 兩個安全配置, 所以排除掉 activiti-spring-boot-starter-basic中的安全配置類 SecurityAutoConfiguration
二、編寫測試流程
寫的較為簡單,但可通過如下進行測試,理解bpmn
-
import enn.activiti.entity.vo.dbDict.DbDictTreeVo;
-
import enn.activiti.entity.vo.dbDict.DbDictVo;
-
import enn.activiti.service.ActivityConsumerService;
-
import enn.activiti.utils.DictUtils;
-
import enn.activiti.utils.common.ResultTreeBean;
-
import enn.base.utils.web.ActionResult;
-
import io.swagger.annotations.Api;
-
import io.swagger.annotations.ApiOperation;
-
import org.activiti.engine.ProcessEngine;
-
import org.activiti.engine.ProcessEngines;
-
import org.activiti.engine.task.Task;
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
import org.springframework.web.bind.annotation.*;
-
-
import javax.annotation.Resource;
-
import java.util.ArrayList;
-
import java.util.HashMap;
-
import java.util.List;
-
import java.util.Map;
-
-
/**
-
* @auther: liuxianling
-
* @date: 2018/12/2 21:38
-
* @description:
-
*/
-
@RestController
-
@RequestMapping("/api/activiti")
-
@Api(value = "/ActivityConsumerController", description = "ActivityConsumerController")
-
public class ActivityConsumerController {
-
-
private static final Logger logger = LoggerFactory.getLogger(DbDictController.class);
-
@Resource
-
ActivityConsumerService activityConsumerService;
-
-
-
/**
-
* 1:啟動流程實例
-
*/
-
@ApiOperation(value = "啟動流程實例", notes = "啟動流程實例")
-
@GetMapping("/testStartProcessInstance")
-
public void testStartProcessInstance(@RequestParam("procdefId") String procdefId){
-
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
processEngine.getRuntimeService()
-
.startProcessInstanceById(procdefId); //這個是查看數據庫中act_re_procdef表
-
}
-
/**
-
* 2.完成請假申請
-
*/
-
@ApiOperation(value = "完成請假申請", notes = "完成請假申請")
-
@GetMapping("/testQingjia")
-
public void testQingjia(String taskId){
-
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
processEngine.getTaskService()
-
.complete(taskId); //查看act_ru_task表
-
}
-
-
/**
-
* 3.班主任查詢當前任務
-
*/
-
@ApiOperation(value = "班主任查詢當前任務", notes = "班主任查詢當前任務")
-
@GetMapping("/taskAssignee")
-
public void testQueryTask(String taskAssignee){
-
-
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
List
<Task> tasks = processEngine.getTaskService()
-
.createTaskQuery()
-
.taskAssignee(taskAssignee)
-
.list();
-
for (Task task : tasks) {
-
System.out.println(task.getName());
-
}
-
}
-
-
/**
-
* 4.班主任完成任務
-
*/
-
@ApiOperation(value = "班主任完成任務", notes = "班主任完成任務")
-
@GetMapping("/testFinishTask_manager")
-
public void testFinishTask_manager(String taskId){
-
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
-
engine.getTaskService()
-
.complete(taskId); //查看act_ru_task數據表
-
}
-
-
/**
-
* 5.教務處主任完成任務
-
*/
-
@ApiOperation(value = "教務處主任完成任務", notes = "教務處主任完成任務")
-
@GetMapping("/testFinishTask_Boss")
-
public void testFinishTask_Boss(String taskId){
-
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
-
processEngine.getTaskService()
-
.complete(taskId); //查看act_ru_task數據表
-
}
-
-
-
-
-
}
三、編寫bpmn
1.1 設置編碼

- 預防activiti亂碼,還需要修改啟動idea配置,增加如下

1.2 創建bpmn

1.3 編寫邏輯
1. StartEvent-->點擊空白處,定義流程名稱-->UserTask(請假流程,定義請假人)-->UserTask(班主任審批,定義班主任)-->userTask(教導處審批,定義教導處)-->EndEvent結束流程,如圖所示:


四、activiti數據庫表概覽
1.1 說明
Activiti工作流總共包含23張數據表,所有的表名默認以“ACT_”開頭。
並且表名的第二部分用兩個字母表明表的用例,而這個用例也基本上跟Service API匹配。
u ACT_GE_* : “GE”代表“General”(通用),用在各種情況下;
u ACT_HI_* : “HI”代表“History”(歷史),這些表中保存的都是歷史數據,比如執行過的流程實例、變量、任務,等等。Activit默認提供了4種歷史級別:
Ø none: 不保存任何歷史記錄,可以提高系統性能;
Ø activity:保存所有的流程實例、任務、活動信息;
Ø audit:也是Activiti的默認級別,保存所有的流程實例、任務、活動、表單屬性;
Ø full:最完整的歷史記錄,除了包含audit級別的信息之外還能保存詳細,例如:流程變量。
對於幾種級別根據對功能的要求選擇,如果需要日后跟蹤詳細可以開啟full。
Acitiviti數據庫中表的命名都是以ACT_開頭的。第二部分是一個兩個字符用例表的標識。此用例大體與服務API是匹配的。
l ACT_RE_*:’RE’表示repository。帶此前綴的表包含的是靜態信息,如,流程定義,流程的資源(圖片,規則等)。
l ACT_RU_*:’RU’表示runtime。這是運行時的表存儲着流程變量,用戶任務,變量,職責(job)等運行時的數據。Activiti只存儲實例執行期間的運行時數據,當流程實例結束時,將刪除這些記錄。這就保證了這些運行時的表小且快。
l ACT_ID_*:’ID’表示identity。這些表包含標識的信息,如用戶,用戶組,等等。
l ACT_HI_*:’HI’表示history。就是這些表包含着歷史的相關數據,如結束的流程實例,變量,任務,等等。
l ACT_GE_*:普通數據,各種情況都使用的數據。
1.2 概覽
1.2.1 Activiti數據表清單:
| 表分類 |
表名 |
解釋 |
| 一般數據 |
通用的流程定義和流程資源,用來保存部署文件的大文本數據 |
|
| 系統相關屬性,存儲這個流程引擎級別的數據 |
||
l 流程文件部署主要涉及到3個表,分別是:ACT_GE_BYTEARRAY、ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF。主要完成“部署包”-->“流程定義文件”-->“所有包內文件”的解析部署關系。從表結構中可以看出,流程定義的元素需要每次從數據庫加載並解析,因為流程定義的元素沒有轉化成數據庫表來完成,當然流程元素解析后是放在緩存中的,具體的還需要后面詳細研究。 l 流程定義中的java類文件不保存在數據庫里 。 l 組織機構的管理相對較弱,如果要納入單點登錄體系內還需要改造完成,具體改造方法有待研究。 l 運行時對象的執行與數據庫記錄之間的關系需要繼續研究 l 歷史數據的保存及作用需要繼續研究。
activiti-administrator 自帶的用戶管理系統,維護用戶和組,需要配置數據連接參數,在activiti-administrator\WEB-INF\applicationContext.xml中,並加入JDBC驅動包。 activiti-cycle PVM活動檢測的,由activiti-rest提供服務,不需配置。 activiti-explorer 可以查看用戶任務和啟動流程,由activiti-rest提供服務,不需配置。 activiti-kickstart 簡單的點對點流程定義維護工具,需要配置數據連接,把activiti.cfg.xml文件放在classes下,並加入驅動包。 activiti-modeler 在線編輯和維護流程定義的工具,最后以文件夾方式部署,需要配置activiti-modeler\WEB-INF\classes\configuration.properties文件。 activiti-probe PVM的觀測服務,由activiti-rest提供服務,不需配置,可以查看deployment、processdefinition、processinstance、database。 activiti-rest 其他幾個應用的服務提供者,需要配置數據連接,把activiti.cfg.xml文件放在classes下,並加入驅動包。 五,表結構變化 參考:https://blog.csdn.net/cs_hnu_scw/article/details/79059965 六. 具體表解析https://blog.csdn.net/hj7jay/article/details/51302829 原文地址:https://blog.csdn.net/wudaoshihun/article/details/84655633#1.1%20%E8%AE%BE%E7%BD%AE%E7%BC%96%E7%A0%81 |
