Activiti7的基础使用

Activiti7的进阶使用


1.idea安装插件

1.1 Activiti BPMN visualizer
	Activiti BPMN visualizer
1.2 测试是否能正常使用
测试是否能正常使用
1.3 右键选择此BPMN.xml文件
右键选择此BPMN.xml文件
1.4 成功
成功

2.Maven

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <activiti.version>7.1.0.M6</activiti.version>
    </properties>

    <dependencies>
        <!--activiti 相关包-->
        <!-- https://mvnrepository.com/artifact/org.activiti/activiti-engine -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <!-- bpmn 模型处理 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- bpmn 转换 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- bpmn json数据转换 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <!-- bpmn 布局 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>${activiti.version}</version>
        </dependency>

        <!-- activiti 云支持 -->
        <!-- https://mvnrepository.com/artifact/org.activiti.cloud/activiti-cloud-services-api -->
        <dependency>
            <groupId>org.activiti.cloud</groupId>
            <artifactId>activiti-cloud-services-api</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>

        </dependency>

        <!-- 链接池 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.36</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>

3.配置文件Xml(最好默认名称)

目录结构
目录结构

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"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">


    <!--dbcp链接池-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/activiti7?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=UTF8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
        <property name="maxActive" value="3"/>
        <property name="maxIdle" value="1"/>
    </bean>


    <!--在默认方式下 bean的id  固定为 processEngineConfiguration-->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!--配置数据库相关的信息-->
        <!--数据库驱动
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>-->
        <!--数据库链接
        <property name="jdbcUrl" value="jdbc:mysql:///activiti"/>-->
        <!--数据库用户名
        <property name="jdbcUsername" value="root"/>-->
        <!--数据库密码
        <property name="jdbcPassword" value="123456"/>-->
        <!--直接引用上面配置的链接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--activiti数据库表在生成时的策略
        true - 如果数据库中已经存在相应的表,那么直接使用,
               如果不存在,那么会创建-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>

log4j.properties

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
#日志文件位置
log4j.appender.LOGFILE.File=D:\\Test\\java\\Test1\\activiti7\\src\\main\\resources\\log\\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

4.创建数据库

4.1 创建新的空数据库

根据 activiti.cfg.xml 文件中所连接的数据库名字创建一个新的空数据库
数据库取名

4.2 建表

4.2.1 创建流程图

此处流程图名会在数据库的 act-re-procdef 表中作为唯一Key标识

  1. 右键选择图标
    右键选择图标
  2. 选中图标修修改信息,如下
    start
    修改Name等信息

在这里插入图片描述

在这里插入图片描述

  1. 点击图标,拖动右上角的箭头,将他们之间的关系连接起来
  2. 右键,save to PNG,将png文件保存下来方便日后查看

4.2.2 创建表的两种方式

单个流程的创建
    /**
     * 测试流程部署
     */
    @Test
    public void testDeployment() {
        //1.创建 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.使用RepositoryService进行部署,将bpmn文件和生成的png文件路径放入其中
        Deployment deploy = repositoryService.createDeployment().name("出差申请流程").addClasspathResource("bpmn/evection.bpmn20.xml").addClasspathResource("bpmn/evection.png").deploy();
        //4.输出部署信息
        System.out.println("流程部署ID=" + deploy.getId());
        System.out.println("流程部署名字=" + deploy.getName());
    }
通过ZIP压缩包一次性创建多个流程

目录结构目录结构

    /**
     * 使用zip包进行批量部署
     */
    @Test
    public void deployProcessByZip() {
        //获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //流程部署
        //读取资源包文件构造成inputStream
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream("bpmn/evection.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        Deployment deploy = repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .deploy();
        System.out.println("流程部署ID" + deploy.getId());
        System.out.println("流程部署名称" + deploy.getName());
    }

可以看到 act-re-procdef 表中已经有了两个流程
act-re-procdef

ps1: 上面的是默认创建方式,activiti.cfg.xml文件名及路径固定,且activiti.cfg.xml文件中有 processEngineConfiguration的配置
.
ps2: 一般创建方式如下

//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();

4.3 Service总览

部署操作表
act-re-deployment 部署表
act-re-procdef 流程定义表
act-ge-bytearray 资源表

service名称service作用
RepositoryServiceactiviti的资源管理类
RuntimeServiceactiviti的流程运行管理类
TaskServiceactiviti的任务管理类
HistoryServiceactiviti的历史管理类
ManagerServiceactiviti的引擎管理类

简单介绍:
.
RepositoryService

是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。

除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。

暂停或激活发布包,对应全部和特定流程定义。
暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。

获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。

.
RuntimeService

Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
.
TaskService

Activiti的任务管理类。可以从这个类中获取任务的信息。
.
HistoryService

Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者,
完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
.
ManagementService

Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于
Activiti 系统的日常维护。

5.简单测试使用

5.1 启动流程实列(根据Key值来启动)

核心
ProcessInstance instance = runtimeService.startProcessInstanceByKey("Test2");

    /**
     * 启动流程实例
     *
     * @`act_hi_actinst` 流程实例执行历史信息
     * @`act_hi_identitylink` 流程参与用户的历史信息
     * @`act_hi_procinst` 流程实例的历史信息
     * @`act_hi_taskinst` 流程任务的历史信息
     * @`act_ru_execution` 流程执行信息
     * @`act_ru_identitylink` 流程的正在参与用户信息
     * @`act_ru_task` 流程当前任务信息
     */
    @Test
    public void testStartProcess() {
        //1.创建 processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.获取runTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //3.根据流程定义 Key 的启动流程
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("Test2");
        //4.输出内容
        System.out.println("流程定义ID=" + instance.getProcessDefinitionId());
        System.out.println("流程实列ID=" + instance.getId());
        System.out.println("当前活动的ID=" + instance.getActivityId());
    }

5.2 任务查询 (根据流程定义的Key和负责人来进行查询)

核心 (taskAssignee是画图的时候Assignee所填写的内容,正常为负责人名称)
taskService.createTaskQuery() .processDefinitionKey("Test2") .taskAssignee("第一个节点") .list();

    /**
     * 查询个人待执行的任务
     */
    @Test
    public void testFindPersonalTaskList() {
        //1、获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取taskService
        TaskService taskService = processEngine.getTaskService();
        //3、根据流程key 和 任务的负责人 查询任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("Test2")
                .taskAssignee("第一个节点")
                .list();
        //4、输出
        for (Task task : list) {
            System.out.println("流程定义ID=" + task.getProcessInstanceId());
            System.out.println("任务ID=" + task.getId());
            System.out.println("任务负责人=" + task.getAssignee());
            System.out.println("任务名称=" + task.getName());
        }
    }

/*
流程定义ID=2501
任务ID=2505
任务负责人=第一个节点
任务名称=这个是Test2的第一个节点
*/

5.3 任务的完成

核心 (使用TaskService,用任务ID来完成,任务id见上方 task.getId() )
taskService.complete("2505");

流程图
流程图

表 act_ru_task
任务第一步执行之前(启动流程实例)
在这里插入图片描述

5.3.1 执行第一次

    /**
     * 完成个人任务
     */
    @Test
    public void completTask() {
        //获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取操作任务的服务 TaskService
        TaskService taskService = processEngine.getTaskService();
        //完成任务,参数:任务id,完成 >第一个节点< 的任务
        taskService.complete("2505");
	}

任务第一步执行之后,第二步执行之前
在这里插入图片描述

5.3.2 执行第二次

通过任务查询 createTaskQuery 获取 ( 任务查询 createTaskQuery

    /**
     * 完成个人任务
     */
    @Test
    public void completTask() {
        //获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取操作任务的服务 TaskService
        TaskService taskService = processEngine.getTaskService();
		//获取 Test2 - 第一个节点 对应的任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("Test2")
                .taskAssignee("第二个节点")
                .singleResult();
        //完成 >第二个节点< 的任务
        taskService.complete(task.getId());
     }

任务第二步执行之后,因为流程结束,所以此表删除这个任务实例
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值