本文就不对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
- # u670Du52A1u7AEFu53E3
- server:
- port: ${SERVER_PORT:8082}
-
- #u6570u636Eu5E93u94FEu63A5u914Du7F6E
- 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-administratorWEB-INFapplicationContext.xml中,并加入JDBC驱动包。 activiti-cycle PVM活动检测的,由activiti-rest提供服务,不需配置。 activiti-explorer 可以查看用户任务和启动流程,由activiti-rest提供服务,不需配置。 activiti-kickstart 简单的点对点流程定义维护工具,需要配置数据连接,把activiti.cfg.xml文件放在classes下,并加入驱动包。 activiti-modeler 在线编辑和维护流程定义的工具,最后以文件夹方式部署,需要配置activiti-modelerWEB-INFclassesconfiguration.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在c++中实现反射的初步想法 对比特币相关的一些技术细节的补充 初窥比特币 根据一个坐标查找其所属区域的一些优化想法 go两种数据类型的区别、数据类型和操作符、常量、变量声明 go的相关包time、os、rand、fmt go语言的特性 结构体 defer、panic、recover
Copyright © 2011-2022 走看看
|