欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot整合activiti工作流(一)

程序员文章站 2024-03-23 17:33:46
...

前言

  • activiti介绍
    activiti是一个业务流程管理(BPM)框架。它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。开发人员可以通过插件直接绘画出业务流程图。
  • ProcessEngine
    ProcessEngine对象是activiti的工作流引擎。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
  • BPMN:
    业务流程建模与标注(Business Process Model and Notation,BPMN),描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
  • 数据库:
    Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
    ACT_RE_*: ‘RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
    ACT_RU_*: ‘RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
    ACT_ID_*: ‘ID’表示identity。 这些表包含身份信息,比如用户,组等等。
    ACT_HI_*: ‘HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
    ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。
  • 资源库流程规则表:
    1) act_re_deployment 部署信息表
    2) act_re_model 流程设计模型部署表
    3) act_re_procdef 流程定义数据表
  • 运行时数据库表:
    1) act_ru_execution 运行时流程执行实例表
    2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
    3) act_ru_task 运行时任务节点表
    4) act_ru_variable 运行时流程变量数据表
  • 历史数据库表:
    1) act_hi_actinst 历史节点表
    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 用户信息表
    这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
  • 通用数据表:
    1) act_ge_bytearray 二进制数据表
    2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。
  • 我的开发环境:
    mysql版本号: 8.0.11
    spring boot : 2.0.1.RELEASE
    mysql-connect-java依赖版本号 :8.0.11
    spring-mybatis-verison依赖版本号:1.3.1

1、添加依赖

在添加升级完mysql到8.0.11后,重新启动项目也报了不少错误,在此也记录一下。

  • 1、mysql驱动依赖版本号和mysql版本号不匹配

    java连接mysql 8.0.11报错:

java.sql.SQLException: Unknown system variable ‘query_cache_size‘
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:545)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115)

升级完mysql connect依赖驱动解决。

  • 2、druid-spring-boot-starter依赖的版本号也需和mysq匹配
    如果报错可能也需要升级数据库链连池的依赖

  • 3、添加activiti工作流依赖

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter-basic</artifactId>
    <version>6.0.0</version>
</dependency>
  • 4、添加ProcessEngineAutoConfiguration数据源配置
@Configuration
public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration {

    //注入数据源和事务管理器
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration(
            @Qualifier("dataSource") DataSource dataSource,
            @Qualifier("transactionManager") PlatformTransactionManager transactionManager,
            SpringAsyncExecutor springAsyncExecutor) throws IOException {
        return this.baseSpringProcessEngineConfiguration(dataSource, transactionManager, springAsyncExecutor);
    }

}

当然你也可按官网的方法,添加一个内存数据库依赖:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.183</version>
</dependency>

如果只是为了初学,那么可先这么做。但一般我们是希望放到自己定的数据库中的。

  • 5、添加bpmn文件
    在resources文件夹下添加processes目录并添加文件bpmn流程文件
    这个文件我是直接从官网复制的
<?xml version="1.0" encoding="UTF-8"?>
<definitions
        xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
        xmlns:activiti="http://activiti.org/bpmn"
        targetNamespace="Examples">

    <process id="oneTaskProcess" name="The One Task Process">
        <startEvent id="theStart" />
        <sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask" />
        <userTask id="theTask" name="my task" />
        <sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd" />
        <endEvent id="theEnd" />
    </process>

</definitions>

为什么要添加到这个目录下,官网原文:
spring boot整合activiti工作流(一)
在processes文件夹下的文件会自动部署。

  • 6、添加完后启动,报错:
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-05-26 00:39:54.577 ERROR 9472 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1702) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:579) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:501) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:760) ~[spring-beans-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
    at com.clockbone.web.bootstrap.ApplicationBoot.main(ApplicationBoot.java:26) [classes/:na]
Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
    at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724) ~[na:1.8.0_171]
    at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531) ~[na:1.8.0_171]
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355) ~[na:1.8.0_171]
    at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286) ~[na:1.8.0_171]
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) ~[na:1.8.0_171]
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) ~[na:1.8.0_171]
    at java.lang.Class.createAnnotationData(Class.java:3521) ~[na:1.8.0_171]

在spring boot启动类上排除类SecurityAutoConfiguration的自动注入,解决。如何排查报错原因参考:
http://hengyunabc.github.io/spring-boot-ArrayStoreException/
https://blog.csdn.net/zhanghai005243/article/details/80234698

  • 7、启动完成

启动完成后,可以看到数据库会自动生成相关表:
spring boot整合activiti工作流(一)

参考官网:

https://spring.io/blog/2015/03/08/getting-started-with-activiti-and-spring-boot
https://www.activiti.org/userguide/index.html#_processenginefactorybean

相关标签: spring activiti