Activiti

  • 简介

    工作流(workfolw),简单概念就是用于流程审批,是计算机自动化完成工作流的审批操作;它主要解决的是"使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的任务,从而实现某个预期的业务目标,或者促使此目标的实现"

  • Activiti开发流程

    1. 画流程定义模型: 遵守BPMN的流程规范,使用BPMN的流程定义工具,通过 流程符号 把整个业务流程定义出来,可以将流程 定义文件字节流保存到模型数据表中(Model).

    2. 部署流程定义(java类,请假定义类): 加载画好的流程定义文件,将它转换成流程定义数据(ProcessDefinition),保存到流程定义数据表中.

    3. 启动流程(Java对象,请假定义实例,针对每个提交申请,启动一个流程实例): 生成流程实例数据(ProcessInstance),生成第1节点任务数据(Task);

    4. 处理人审批流程节点任务: 完成任务审批,生成审批结果,生成下一节点任务数据.

  • 环境准备

    1. springboot 2.5

    2. Activiti 7.1.0.M6

    3. Mysql 5.7

    4. JDK 1.8

    5. maven依赖:

    <dependencies>
        <!--activiti核心依赖-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>7.1.0.M6</version>
        </dependency>
​
        <!--mysql驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
​
        <!-- 日志  -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.26</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.26</version>
        </dependency>
​
        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
​
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>
​

spring核心配置文件:resource目录下创建activiti.cfg.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
​
    <!--默认方式下,bean的id必须是processEngineConfiguration -->
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 配置数据源 -->
        <property name="jdbcUrl"
                  value="jdbc:mysql://127.0.0.1:3306/activiti01?characterEncoding=utf8&amp;nullCatalogMeansCurrent=true" />
        <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="root" />
​
        <!-- activiti 数据库表生成策略 -->
        <!--
            自动更新数据库结构
            true:适用开发环境,默认值。activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
            false:适用生产环境。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
            create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
            drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
        -->
        <property name="databaseSchemaUpdate" value="true" />
    </bean>
​
</beans>
​

日志文件log4j.properties

log4j.rootCategory=debug, CONSOLE, LOGFILE
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
​
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss.SSS} %p [%t] %C.%M(%L) | %m%n
​
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=log/study/activiti/activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
​

测试方法:

/**
 * @author: shaoyun_Wang
 * @create: 2022-05-19 23:10
 * @Description:
 */
public class ActivitiTest01 {
​
    /**
     * 创建 Activiti 流程引擎实例
     */
    @Test
    public void getProcessEngine(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        System.out.println("processEngine:" + processEngine);
    }
}

运行结束后,数据库会自动创建出25张表:

  • 底层实现

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //进入getDefaultProcessEngine()方法

    判断当前有无processEngine

       public static ProcessEngine getDefaultProcessEngine() {
            return getProcessEngine("default");
        }
    ​
        public static ProcessEngine getProcessEngine(String processEngineName) {
            if (!isInitialized()) {
                init();
            }
    ​
            return (ProcessEngine)processEngines.get(processEngineName);
        }

    如果没有调用init方法:默认情况下加载名为activiti.cfg.xml的文件,然后调用initProcessEngineFromResource方法,去初始化ProcessEngine

再看initProcessEngineFromResource方法:调用了buildProcessEngine方法创建ProcessEngine

再进入buildProcessEngine方法:将文件转成流,再调用ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(inputStream)返回ProcessEngineConfiguration,去创建ProcessEngine

createProcessEngineConfigurationFromInputStream方法:最终调用BeansConfigurationHelper去创建,并且传参beanName=processEngineConfiguration

createProcessEngineConfigurationFromInputStream方法有很多种,因此我们可以指定特定名字的核心配置文件

//自定义配置文件名,不需要他默认的;
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti2.cfg.xml","processEngineConfiguration22");
ProcessEngine processEngine1 = configuration.buildProcessEngine();

同样也能创建ProcessEngine: