zoukankan      html  css  js  c++  java
  • activiti 7 + springboot2(六) SpringBoot2 整合 Activiti7

    activiti 7 的springboot插件能自动创建数据表,自动部署设计好的流程,不需要我们像前面那样代码创建数据库和部署流程。

    (一)首先 pom.xml 文件中引入相关的依赖,具体依赖如下所示: 

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.activiti.examples</groupId>
        <artifactId>activiti-3</artifactId>
        <version>1.0</version>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>8</java.version>
            <maven.compiler.source>${java.version}</maven.compiler.source>
            <maven.compiler.target>${java.version}</maven.compiler.target>
            <activiti-dependencies.version>7.1.24</activiti-dependencies.version>
        </properties>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.activiti.dependencies</groupId>
                    <artifactId>activiti-dependencies</artifactId>
                    <version>${activiti-dependencies.version}</version>
                    <scope>import</scope>
                    <type>pom</type>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <!-- mysql数据库 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <!-- 测试 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven-compiler-plugin.version}</version>
                    <configuration>
                        <release>${java.version}</release>
                        <showDeprecation>true</showDeprecation>
                        <showWarnings>true</showWarnings>
                        <optimize>true</optimize>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
        <!-- 添加私服仓库地址,否则找不到包 -->
        <repositories>
            <repository>
                <id>alfresco</id>
                <name>Activiti Releases</name>
                <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
                <releases>
                    <enabled>true</enabled>
                </releases>
            </repository>
        </repositories>
    
    </project>

    (二)springboot 的配置文件 application.yml中添加相关的配置:

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/platform_activiti?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
        username: root
        password: pass
        hikari:
          minimum-idle: 5
          maximum-pool-size: 20
          connection-test-query: SELECT 1
      activiti:
    database-schema-update: true # 开启历史库 db-history-used: true history-level: audit

    参数说明:

    databaseSchemaUpdate配置项可以设置流程引擎启动和关闭时数据库执行的策略。 databaseSchemaUpdate有以下四个值:

    • false:false为默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
    • true:设置为该值后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
    • create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
    • drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。

    history-level对于历史数据,保存到何种粒度,Activiti提供了history-level属性对其进行配置。history-level属性有点像log4j的日志输出级别,该属性有以下四个值:

    • none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
    • activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
    • audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
    • full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。

    db-history-used为true表示使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立,则流程图及运行节点无法展示

    (三)流程资源

      资源文件放在  resources/processes 目录下,activiti程序启动会自动发布流程

      

    (四)编写Applocation主程序

    package com.activiti.example;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class ActivitiApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ActivitiApplication.class, args);
        }
    
    }

    运行程序,从控制台输出中可以看到,自动创建了数据库,并且发布了"请假申请"的流程

    (五)编写基于SpringBootTest的测试程序

    package com.activiti.example;
    
    import org.activiti.api.process.runtime.ProcessRuntime;
    import org.activiti.api.task.runtime.TaskRuntime;
    import org.activiti.engine.*;
    import org.activiti.engine.history.HistoricTaskInstance;
    import org.activiti.engine.task.Task;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.List;
    import java.util.Map;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ActivitiTest {
        @Autowired
        private RepositoryService repositoryService;
        @Autowired
        private TaskService taskService;
        @Autowired
        private RuntimeService runtimeService;
        @Autowired
        private HistoryService historyService;
    /**
         * 启动一个实例
         */
        @Test
        public void startProcessInstance() {
            System.out.println("Number of process definitions : "+ repositoryService.createProcessDefinitionQuery().count());
            System.out.println("Number of tasks : " + taskService.createTaskQuery().count());
            runtimeService.startProcessInstanceByKey("myProcess_1");
        }
    
        /**
         * 查询用户的任务列表
         */
        @Test
        public void taskQuery() {
            //根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
            List<Task> list = taskService.createTaskQuery()
                    .processDefinitionKey("myProcess_1")
                    .taskAssignee("john")
                    .list();
    
            if(list!=null && list.size()>0){
                for(Task task:list){
                    System.out.println("任务ID:"+task.getId());
                    System.out.println("任务名称:"+task.getName());
                    System.out.println("任务的创建时间:"+task.getCreateTime());
                    System.out.println("任务的办理人:"+task.getAssignee());
                    System.out.println("流程实例ID:"+task.getProcessInstanceId());
                    System.out.println("执行对象ID:"+task.getExecutionId());
                    System.out.println("流程定义ID:"+task.getProcessDefinitionId());
                    System.out.println("getOwner:"+task.getOwner());
                    System.out.println("getCategory:"+task.getCategory());
                    System.out.println("getDescription:"+task.getDescription());
                    System.out.println("getFormKey:"+task.getFormKey());
                    Map<String, Object> map = task.getProcessVariables();
                    for (Map.Entry<String, Object> m : map.entrySet()) {
                        System.out.println("key:" + m.getKey() + " value:" + m.getValue());
                    }
                    for (Map.Entry<String, Object> m : task.getTaskLocalVariables().entrySet()) {
                        System.out.println("key:" + m.getKey() + " value:" + m.getValue());
                    }
    
                }
            }
        }
    
        /**
         * 完成任务
         */
        @Test
        public void completeTask(){
            //任务ID
            String taskId = "967465fe-3367-11ea-a057-30b49ec7161f";
            taskService.complete(taskId);
            System.out.println("完成任务:任务ID:"+taskId);
        }
    
        /**
         * 历史活动实例查询
         */
        @Test
        public void queryHistoryTask() {
            List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery() // 创建历史活动实例查询
                    .processInstanceId("9671cdea-3367-11ea-a057-30b49ec7161f") // 执行流程实例id
                    .orderByTaskCreateTime()
                    .asc()
                    .list();
            for (HistoricTaskInstance hai : list) {
                System.out.println("活动ID:" + hai.getId());
                System.out.println("流程实例ID:" + hai.getProcessInstanceId());
                System.out.println("活动名称:" + hai.getName());
                System.out.println("办理人:" + hai.getAssignee());
                System.out.println("开始时间:" + hai.getStartTime());
                System.out.println("结束时间:" + hai.getEndTime());
            }
        }
    }

    源码下载   https://download.csdn.net/download/zsg88/12094838

  • 相关阅读:
    代码题(11)— 链表两数相加
    机器学习(十九)— xgboost初试kaggle
    【js】鼠标跟随效果
    【js】event(事件对象)详解
    【vue】vue +element 搭建项目,this.$nextTick用法
    【vue】vue +element 搭建及开发中项目中,遇到的错误提示
    【vue】vue +element 搭建项目,点击空白处关闭弹窗
    【js】把一个json对象转成想要的数组
    【vue】vue +element 搭建项目,使用el-date-picker组件遇到的坑
    【vue】vue +element 搭建项目,在使用InputNumber 计数器时遇到的问题
  • 原文地址:https://www.cnblogs.com/zsg88/p/12174750.html
Copyright © 2011-2022 走看看