本文就不对activiti做解释,下面直接看项目集成

以下顺序方面根据我的理解来,可以先从第二章看,再看第一张与第三章

增加activiti表的API,备注用。

目录

一、springboot2.X集成activiti

1.1. 引入jar包

1.2. 创建启动类(componentScan是自己项目持久化模板,可以直接删掉)

1.3. 配置application.yml

1.4. 启动可能出现的错误

二、编写测试流程

三、编写bpmn

1.1 设置编码

1.2 创建bpmn

1.3 编写逻辑

四、activiti数据库表概览

1.1 说明

1.2 概览

1.2.1   Activiti数据表清单:



一、springboot2.X集成activiti

1.1. 引入jar包


  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <artifactId>enn-activiti</artifactId>
  6.     <groupId>enn.activiti</groupId>
  7.     <version>1.1.1-SNAPSHOT</version>
  8.     <packaging>jar</packaging>
  9.     <parent>
  10.         <groupId>org.springframework.boot</groupId>
  11.         <artifactId>spring-boot-starter-parent</artifactId>
  12.         <version>2.0.4.RELEASE</version>
  13.     </parent>
  14.     <dependencies>
  15.         <dependency>
  16.             <groupId>org.springframework.boot</groupId>
  17.             <artifactId>spring-boot-starter-web</artifactId>
  18.             <exclusions>
  19.                 <exclusion>
  20.                     <groupId>org.hibernate.validator</groupId>
  21.                     <artifactId>hibernate-validator</artifactId>
  22.                 </exclusion>
  23.                 <exclusion>
  24.                     <groupId>org.apache.logging.log4j</groupId>
  25.                     <artifactId>log4j-to-slf4j</artifactId>
  26.                 </exclusion>
  27.                 <exclusion>
  28.                     <groupId>org.slf4j</groupId>
  29.                     <artifactId>jul-to-slf4j</artifactId>
  30.                 </exclusion>
  31.                 <exclusion>
  32.                     <groupId>org.springframework.boot</groupId>
  33.                     <artifactId>spring-boot-starter-tomcat</artifactId>
  34.                 </exclusion>
  35.             </exclusions>
  36.         </dependency>
  37.     
  38.         <dependency>
  39.             <groupId>org.activiti</groupId>
  40.             <artifactId>activiti-spring-boot-starter-basic</artifactId>
  41.             <version>6.0.0</version>
  42.             <exclusions>
  43.                 <exclusion>
  44.                     <groupId>javax.persistence</groupId>
  45.                     <artifactId>persistence-api</artifactId>
  46.                 </exclusion>
  47.             </exclusions>
  48.         </dependency>
  49.         <dependency>
  50.             <groupId>org.springframework.boot</groupId>
  51.             <artifactId>spring-boot-starter-data-jpa</artifactId>
  52.         </dependency>
  53.         <dependency>
  54.             <groupId>org.springframework.boot</groupId>
  55.             <artifactId>spring-boot-starter-thymeleaf</artifactId>
  56.         </dependency>
  57.         <dependency>
  58.             <groupId>org.springframework.boot</groupId>
  59.             <artifactId>spring-boot-starter-test</artifactId>
  60.             <scope>test</scope>
  61.         </dependency>
  62.     
  63.         
  64.     </dependencies>
  65.     <profiles>
  66.         <profile>
  67.             <id>local</id>
  68.             <properties>
  69.                 <spring.profiles.active>local</spring.profiles.active>
  70.             </properties>
  71.             <activation>
  72.                 <activeByDefault>true</activeByDefault>
  73.             </activation>
  74.         </profile>
  75.         <profile>
  76.             <id>dev</id>
  77.             <properties>
  78.                 <spring.profiles.active>dev</spring.profiles.active>
  79.             </properties>
  80.         </profile>
  81.         
  82.     </profiles>
  83.     <build>
  84.         <finalName>enn-activiti</finalName>
  85.         <plugins>
  86.             <plugin>
  87.                 <groupId>org.apache.maven.plugins</groupId>
  88.                 <artifactId>maven-compiler-plugin</artifactId>
  89.                 <configuration>
  90.                     <source>${java.version}</source>
  91.                     <target>${java.version}</target>
  92.                 </configuration>
  93.             </plugin>
  94.             <plugin>
  95.                 <groupId>org.springframework.boot</groupId>
  96.                 <artifactId>spring-boot-maven-plugin</artifactId>
  97.             </plugin>
  98.             <plugin>
  99.                 <groupId>org.apache.maven.plugins</groupId>
  100.                 <artifactId>maven-surefire-plugin</artifactId>
  101.                 <configuration>
  102.                     <skip>true</skip>
  103.                     <testFailureIgnore>true</testFailureIgnore>
  104.                 </configuration>
  105.             </plugin>
  106.         </plugins>
  107.     </build>
  108. </project>

1.2. 创建启动类(componentScan是自己项目持久化模板,可以直接删掉)


  1. @SpringBootApplication(exclude = SecurityAutoConfiguration.class)
  2. @ComponentScan(basePackages = {"enn.activiti","enn.base.redis.cluster",
  3. "enn.base.utils","enn.base.mysql.ordinary","enn.base.mysql.dao"})
  4. @EnableAsync
  5. public class Application {
  6. static ConfigurableApplicationContext applicationContext;
  7. public static void main(String[] args) {
  8. applicationContext = SpringApplication.run(Application.class, args);
  9. }

}

1.3. 配置application.yml


  1. # \u670D\u52A1\u7AEF\u53E3
  2. server:
  3. port: ${SERVER_PORT:8082}
  4. #\u6570\u636E\u5E93\u94FE\u63A5\u914D\u7F6E
  5. spring:
  6. datasource:
  7. name: ecityposition
  8. type: com.alibaba.druid.pool.DruidDataSource
  9. filters: stat
  10. url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8
  11. driver-class-name: com.mysql.jdbc.Driver
  12. username: root
  13. password: root
  14. #配置初始化大小/最小/最大
  15. initial-size: 1
  16. min-idle: 1
  17. max-active: 20
  18. #获取连接等待超时时间
  19. max-wait: 60000
  20. #间隔多久进行一次检测,检测需要关闭的空闲连接
  21. time-between-eviction-runs-millis: 60000
  22. #一个连接在池中最小生存的时间
  23. min-evictable-idle-time-millis: 300000
  24. validation-query: SELECT 'x'
  25. test-while-idle: true
  26. test-on-borrow: false
  27. test-on-return: false
  28. #打开PSCache,并指定每个连接上PSCache的大小。oracle设为true,mysql设为false。分库分表较多推荐设置为false
  29. pool-prepared-statements: false
  30. max-pool-prepared-statement-per-connection-size: 20
  31. jpa:
  32. properties:
  33. hibernate:
  34. hbm2ddl:
  35. auto: update
  36. jackson:
  37. date-format: yyyy-MM-dd HH:mm:ss
  38. time-zone: GMT+8
  39. activiti:
  40. check-process-definitions: false
  41. 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


  1. import enn.activiti.entity.vo.dbDict.DbDictTreeVo;
  2. import enn.activiti.entity.vo.dbDict.DbDictVo;
  3. import enn.activiti.service.ActivityConsumerService;
  4. import enn.activiti.utils.DictUtils;
  5. import enn.activiti.utils.common.ResultTreeBean;
  6. import enn.base.utils.web.ActionResult;
  7. import io.swagger.annotations.Api;
  8. import io.swagger.annotations.ApiOperation;
  9. import org.activiti.engine.ProcessEngine;
  10. import org.activiti.engine.ProcessEngines;
  11. import org.activiti.engine.task.Task;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.web.bind.annotation.*;
  15. import javax.annotation.Resource;
  16. import java.util.ArrayList;
  17. import java.util.HashMap;
  18. import java.util.List;
  19. import java.util.Map;
  20. /**
  21. * @auther: liuxianling
  22. * @date: 2018/12/2 21:38
  23. * @description:
  24. */
  25. @RestController
  26. @RequestMapping("/api/activiti")
  27. @Api(value = "/ActivityConsumerController", description = "ActivityConsumerController")
  28. public class ActivityConsumerController {
  29. private static final Logger logger = LoggerFactory.getLogger(DbDictController.class);
  30. @Resource
  31. ActivityConsumerService activityConsumerService;
  32. /**
  33. * 1:启动流程实例
  34. */
  35. @ApiOperation(value = "启动流程实例", notes = "启动流程实例")
  36. @GetMapping("/testStartProcessInstance")
  37. public void testStartProcessInstance(@RequestParam("procdefId") String procdefId){
  38. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  39. processEngine.getRuntimeService()
  40. .startProcessInstanceById(procdefId); //这个是查看数据库中act_re_procdef表
  41. }
  42. /**
  43. * 2.完成请假申请
  44. */
  45. @ApiOperation(value = "完成请假申请", notes = "完成请假申请")
  46. @GetMapping("/testQingjia")
  47. public void testQingjia(String taskId){
  48. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  49. processEngine.getTaskService()
  50. .complete(taskId); //查看act_ru_task表
  51. }
  52. /**
  53. * 3.班主任查询当前任务
  54. */
  55. @ApiOperation(value = "班主任查询当前任务", notes = "班主任查询当前任务")
  56. @GetMapping("/taskAssignee")
  57. public void testQueryTask(String taskAssignee){
  58. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  59. List<Task> tasks = processEngine.getTaskService()
  60. .createTaskQuery()
  61. .taskAssignee(taskAssignee)
  62. .list();
  63. for (Task task : tasks) {
  64. System.out.println(task.getName());
  65. }
  66. }
  67. /**
  68. * 4.班主任完成任务
  69. */
  70. @ApiOperation(value = "班主任完成任务", notes = "班主任完成任务")
  71. @GetMapping("/testFinishTask_manager")
  72. public void testFinishTask_manager(String taskId){
  73. ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
  74. engine.getTaskService()
  75. .complete(taskId); //查看act_ru_task数据表
  76. }
  77. /**
  78. * 5.教务处主任完成任务
  79. */
  80. @ApiOperation(value = "教务处主任完成任务", notes = "教务处主任完成任务")
  81. @GetMapping("/testFinishTask_Boss")
  82. public void testFinishTask_Boss(String taskId){
  83. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  84. processEngine.getTaskService()
  85. .complete(taskId); //查看act_ru_task数据表
  86. }
  87. }

三、编写bpmn

1.1 设置编码

springboot2.04与activiti 6.0集成-LMLPHP

  1. 预防activiti乱码,还需要修改启动idea配置,增加如下

springboot2.04与activiti 6.0集成-LMLPHP

1.2 创建bpmn

springboot2.04与activiti 6.0集成-LMLPHP

1.3 编写逻辑

1. StartEvent-->点击空白处,定义流程名称-->UserTask(请假流程,定义请假人)-->UserTask(班主任审批,定义班主任)-->userTask(教导处审批,定义教导处)-->EndEvent结束流程,如图所示:

springboot2.04与activiti 6.0集成-LMLPHP

springboot2.04与activiti 6.0集成-LMLPHP

四、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数据表清单:

表分类

表名

解释

一般数据

通用的流程定义和流程资源,用来保存部署文件的大文本数据

系统相关属性,存储这个流程引擎级别的数据

		<p>&nbsp;</p>
</td>
<td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_ACTINST" target="_blank"></a><a target="_blank">ACT_HI_ACTINST</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的流程实例</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_ATTACHMENT" target="_blank"></a><a target="_blank">ACT_HI_ATTACHMENT</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的流程附件</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_COMMENT" target="_blank"></a><a target="_blank">ACT_HI_COMMENT</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的说明性信息</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_DETAIL" target="_blank"></a><a target="_blank">ACT_HI_DETAIL</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的流程运行中的细节信息</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_IDENTITYLINK" target="_blank"></a><a target="_blank">ACT_HI_IDENTITYLINK</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的流程运行过程中用户关系</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_PROCINST" target="_blank"></a><a target="_blank">ACT_HI_PROCINST</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的流程实例</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_TASKINST" target="_blank"></a><a target="_blank">ACT_HI_TASKINST</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的任务实例</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_HI_VARINST" target="_blank"></a><a target="_blank">ACT_HI_VARINST</a></p>
</td>
<td style="vertical-align:top;">
<p>历史的流程运行中的变量信息</p>
</td>
</tr><tr><td rowspan="4">
<p><a name="OLE_LINK62" target="_blank"></a><a name="OLE_LINK61" target="_blank">用户用户组表</a></p>
</td>
<td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_ID_GROUP" target="_blank"></a><a target="_blank">ACT_ID_GROUP</a></p>
</td>
<td style="vertical-align:top;">
<p>身份信息-组信息</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_ID_INFO" target="_blank"></a><a target="_blank">ACT_ID_INFO</a></p>
</td>
<td style="vertical-align:top;">
<p>身份信息-组信息</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_ID_MEMBERSHIP" target="_blank"></a><a target="_blank">ACT_ID_MEMBERSHIP</a></p>
</td>
<td style="vertical-align:top;">
<p>身份信息-用户和组关系的中间表</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_ID_USER" target="_blank"></a><a target="_blank">ACT_ID_USER</a></p>
</td>
<td style="vertical-align:top;">
<p>身份信息-用户信息</p>
</td>
</tr><tr><td rowspan="3">
<p><a name="OLE_LINK25" target="_blank"></a><a name="OLE_LINK24" target="_blank">流程定义表</a></p>
</td>
<td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RE_DEPLOYMENT" target="_blank"></a><a target="_blank">ACT_RE_DEPLOYMENT</a></p>
</td>
<td style="vertical-align:top;">
<p>部署单元信息,用来存储部署时需要持久化保存下来的信息</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RE_MODEL" target="_blank"></a><a target="_blank">ACT_RE_MODEL</a></p>
</td>
<td style="vertical-align:top;">
<p>模型信息</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RE_PROCDEF" target="_blank"></a><a target="_blank">ACT_RE_PROCDEF</a></p>
</td>
<td style="vertical-align:top;">
<p>已部署的流程定义,业务流程定义数据表</p> <p>此表和ACT_RE_DEPLOYMENT是多对一的关系,即,</p> <p>一个部署的bar包里可能包含多个流程定义文件,</p> <p>每个流程定义文件都会有一条记录在ACT_REPROCDEF表内,</p> <p>每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内</p> <p>的一个资源文件和PNG图片文件。和ACT_GE_BYTEARRAY</p> <p>的关联是通过程序用ACT_GE_BYTEARRAY.NAME与</p> <p>ACT_RE_PROCDEF.NAME_完成的,在数据库表结构中没有体现</p>
</td>
</tr><tr><td rowspan="6">
<p><a name="OLE_LINK13" target="_blank"></a><a name="OLE_LINK12" target="_blank">运行实例表</a></p>
</td>
<td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RU_EVENT_SUBSCR" target="_blank"></a><a target="_blank">ACT_RU_EVENT_SUBSCR</a></p>
</td>
<td style="vertical-align:top;">
<p>运行时事件</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RU_EXECUTION" target="_blank"></a><a target="_blank">ACT_RU_EXECUTION</a></p>
</td>
<td style="vertical-align:top;">
<p>运行时流程执行实例</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RU_IDENTITYLINK" target="_blank"></a><a target="_blank">ACT_RU_IDENTITYLINK</a></p>
</td>
<td style="vertical-align:top;">
<p>运行时用户关系信息,主要存储当前节点参与者的信息。</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RU_JOB" target="_blank"></a><a target="_blank">ACT_RU_JOB</a></p>
</td>
<td style="vertical-align:top;">
<p>运行时作业,运行时定时任务数据表</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RU_TASK" target="_blank"></a><a target="_blank">ACT_RU_TASK</a></p>
</td>
<td style="vertical-align:top;">
<p>运行时任务</p>
</td>
</tr><tr><td style="vertical-align:top;">
<p><a name="headLOCAL_1-ACT_RU_VARIABLE" target="_blank"></a><a target="_blank">ACT_RU_VARIABLE</a></p>
</td>
<td style="vertical-align:top;">
<p>运行时变量表</p>
</td>
</tr></tbody></table></div><p>注:</p>

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

05-23 21:53