SpringBoot整合Activiti工作流框架的使用

目录
  • Activiti介绍
  • SpringBoot整合
  • 使用starter
  • 不使用starter
  • 使用Activiti

Activiti 介绍

  • Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。
  • 简单来说activiti是一个业务流程管理引擎,会沿着设计者设计好的流程,一步一步的执行下去,直到终点。

SpringBoot 整合

配置

activiti会框架会创建一系列的表,所以要配置相关数据库的信息,需要注意的是,在url中,添加了针对数据库的条件,其中最后一条nullCatalogMeansCurrent=true非常重要,至于有什么用就不概述了,但是没有这条语句的话就无法自动创建对应的二十八张表。

server:
  port: 8014

spring:
  application:
    name: workflow
  datasource:
    name: mysqlDatasource
    url: jdbc:mysql://localhost:3306/core?useUnicode=true&nullCatalogMeansCurrent=true
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    # 监控统计拦截的filters,如果启用log4j记得添加依赖
    filters: stat,wall
  # activiti
  activiti:
    #每次应用启动不检查Activiti数据表是否存在及版本号是否匹配,提升应用启动速度
    database-schema-update: true
    #在项目单独作为一个引擎,本身不部署流程的时候,如果resources目录没有“processes”目录,启动项目报错–找不到processes目录。需要在配置文件中添加以下内容:
    check-process-definitions: false
    process-definition-location-prefix: classpath:/processes/
    process-definition-location-suffixes:
      -**.bpmn
      -**.bpmn20.xml
    #保存历史数据级别设置为full最高级别,便于历史数据的追溯
    history-level: full
  # activiti 安全访问
  security:
    basic:
      enabled: true
    user:
      name: root
      password: root

版本问题

  • 注意 SpringBootActiviti 的版本问题
  • springboot2.0不能与activiti6.0.0直接集成使用,因为activiti6.0.0出来的时候springboot2.0还没有出来,activiti6.0.0 支持springboot1.2.6以上,2.0.0以下的版本。

使用 starter

依赖

这个版本满足高版本的springboot,直接使用就行

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M3.1</version>
</dependency>

需要注意的是,这里的依赖版本,需要对应数据库中act_ge_property表中schema.version版本信息,所以一般不建议在创建完表之后修改依赖信息

启动项目成功后自动创建表

需要在配置文件中加上 activiti-security的配置

 # activiti 安全访问
  security:
    basic:
      enabled: true
    user:
      name: root
      password: root

不使用 starter

依赖

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring</artifactId>
    <version>6.0.0</version>
</dependency>

配置代码

@Configuration
public class ActivitiConfig {

    private static final Logger logger = LoggerFactory.getLogger(ActivitiConfig.class);

    /**
     * 配置分为以下几步骤
     * 1. 创建ActivitiConfig
     * 2. 使用ActivitiConfig创建ProcessEngineFactoryBean
     * 3. 使用ProcessEngineFactoryBean创建ProcessEngine对象
     * 4. 使用ProcessEngine对象创建需要的服务对象
     */
    private final DataSource dataSource;

    private final PlatformTransactionManager platformTransactionManager;

    @Autowired
    public ActivitiConfig(DataSource dataSource, PlatformTransactionManager transactionManager) {
        this.dataSource = dataSource;
        platformTransactionManager = transactionManager;
    }

    /*
     * 1. 创建配置文件,也就是提供一些配置信息,这样就可以自定义自己的创建信息了
     * 需要一些参数,1. 数据源。2. 事务管理器。
     * 这里还加入了自动扫描process包下的bpmn(流程定义文件)的设置,这样就可以省去了部署
     * */
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
        SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();
        spec.setDataSource(dataSource);
        spec.setTransactionManager(platformTransactionManager);
        spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        Resource[] resources = null;
        // 启动自动部署流程
        try {
            resources = new PathMatchingResourcePatternResolver().getResources("classpath*:processes/*.*.xml");
        } catch (IOException e) {
            logger.error("Error Occur:", e);
        }
        spec.setDeploymentResources(resources);
        return spec;
    }

    @Bean
    public ProcessEngineFactoryBean processEngine() {
        ProcessEngineFactoryBean engineFactoryBean = new ProcessEngineFactoryBean();
        engineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration());
        return engineFactoryBean;
    }

    @Bean
    public RepositoryService repositoryService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getRepositoryService();
    }

    @Bean
    public RuntimeService runtimeService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getRuntimeService();
    }

    @Bean
    public TaskService taskService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getTaskService();
    }

    @Bean
    public HistoryService historyService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getHistoryService();
    }
}

resources中创建process文件夹,文件夹的路径和名字需要和ActivitiConfig中的配置保持一致启动springBoot项目即可创建完成

使用 Activiti

Idea 安装 Activiti BPMN visualizer 插件

编写测试 bpmn.xml

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn"
             xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
             xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
             typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
             targetNamespace="http://www.activiti.org/processdef">
    <process id="test" name="test" isExecutable="true">
        <startEvent id="startevent1" name="Start"></startEvent>
        <endEvent id="endevent1" name="End"></endEvent>
        <userTask id="usertask1" name="HelloWorld" activiti:assignee="goxcheer"></userTask>
        <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
        <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_test">
        <bpmndi:BPMNPlane bpmnElement="test" id="BPMNPlane_test">
            <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
                <omgdc:Bounds height="35.0" width="41.0" x="220.0" y="180.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="640.0" y="180.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
                <omgdc:Bounds height="55.0" width="105.0" x="390.0" y="170.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
                <omgdi:waypoint x="261.0" y="197.0"></omgdi:waypoint>
                <omgdi:waypoint x="390.0" y="197.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
                <omgdi:waypoint x="495.0" y="197.0"></omgdi:waypoint>
                <omgdi:waypoint x="640.0" y="197.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

编写测试代码

测试代码

@RequestMapping("/test")
@RestController
public class ActivitiTestController {

    private static final Logger logger = LoggerFactory.getLogger(ActivitiTestController.class);

    @Autowired
    RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @RequestMapping("/test1")
    public void test1() {
        logger.info("Start.........");
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("test");
        logger.info("流程启动成功,流程id:{}", pi.getId());
    }

    @RequestMapping("/test2")
    public void test2() {
        String userId = "root";
        List<Task> resultTask = taskService.createTaskQuery().processDefinitionKey("test").taskCandidateOrAssigned(userId).list();
        logger.info("任务列表:{}", resultTask);
    }

}

…简单配置到此结束

完整配置代码见 :https://gitee.com/Marlon_Brando/onlineshop_back/tree/develop/os_workflow

到此这篇关于SpringBoot整合Activiti工作流框架的使用的文章就介绍到这了,更多相关SpringBoot Activiti工作流内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    记录一下工作流的在Springboot中的使用,,顺便写个demo,概念,什么东西的我就不解释了,如有问题欢迎各位大佬指导一下. 1.创建springboot项目后导入依赖 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version&

  • SpringBoot整合Activiti工作流框架的使用

    目录 Activiti介绍 SpringBoot整合 使用starter 不使用starter 使用Activiti Activiti 介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度.Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速.超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员. 简单来说activit

  • springboot整合quartz定时任务框架的完整步骤

    目录 Spring整合Quartz pom文件 对应的properties 文件 配置类 自定义任务类:ScheduledTask 获取spring中bean的工具类:SpringContextUtil 定时任务服务接口:QuartzService QuartzService实现类:QuartzServiceImpl ScheduledTaskRunner类 任务实体类:QuartzTask 任务service层 service实现类 任务controller 数据表 具体使用 具体效果 总结

  • SpringBoot整合Dozer映射框架流程详解

    目录 1. Dozer 介绍 2. 为什么要使用映射框架 Dozer 3. Dozer 映射框架的使用 1. Dozer 介绍 Dozer 是一个 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象.Dozer 是用来对两个对象之间属性转换的工具,有了这个工具之后,我们将一个对象的所有属性值转给另一个对象时,就不需要再去写重复的调用 set 和 get 方法. 最重要的是,Dozer 可以确保来自数据库的内部域对象不会渗入外部表示层或外部消费者,它还可

  • SpringBoot 整合 Quartz 定时任务框架详解

    目录 前言 一.简单聊一聊 Quartz 1.1.Quartz 概念 二.SpringBoot 使用 Quartz 2.1.基本步骤 2.2.执行 Quartz 需要的SQL文件 2.3.Controller 2.4.Service 划重点 2.5.实体类 2.6.简单的 Job 案例 2.7.那么该如何使用呢? 前言 在选择技术栈之前,一定要先明确一件事情,你真的需要用它吗?还有其他方式可以使用吗? 相比其他技术技术,优点在哪里呢?使用了之后的利与弊等等. 写这个主要是因为一直想写一下定时任务

  • 使用SpringBoot整合Activiti6工作流的操作方法

    目录 1.idea安装actibpm流程设计器 2.创建maven项目,导入相关依赖,添加配置文件 3.新增启动类,剔除掉activiti默认集成springsecurity 4.新建文件夹processes(名称不能更改),新增Bpmn文件,画流程图 5.创建Controller 6.启动项目,Activiti会自动创建28张表,自动部署processes目录Bpnm文件 7.测试Controller 1.idea安装actibpm流程设计器 打开idea插件搜索actibpm,安装成功后重启

  • SpringBoot整合Security安全框架实现控制权限

    目录 一.前言 介绍: 官网: 优缺点: 案例: 二.环境准备 2.1.数据库表 2.2.导入依赖 2.3.配置文件 2.4.WebSecurityConfig Security的主要配置类: 2.5.Security身份验证 2.6.Security授权 2.7.UserDetailsService 2.7.MacLoginUrlAuthenticationEntryPoint 2.8.MyAccessDeniedHandler 2.9.MyLogoutSuccessHandler 2.10.

  • springboot整合flowable框架入门步骤

    最近工作中有用到工作流的开发,引入了flowable工作流框架,在此记录一下springboot整合flowable工作流框架的过程,以便后续再次使用到时可以做一些参考使用,如果项目中有涉及到流程审批的话,可以使用该框架帮我们实现流程图示化展示的功能,为了快速了解flowable工作流框架的一个使用过程,我们直接步入主题,springboot整合flowable工作流框架的步骤如下: 1.首先创建一个springboot工程,然后引入flowable pom依赖,代码如下: <dependenc

  • SpringBoot整合Security实现权限控制框架(案例详解)

    目录 一.前言 二.环境准备 2.1.数据库表 四.测试 五.总结 我想每个写项目的人,都肯定会遇到控制权限这个问题. 例如这个这个链接只能管理员访问,那个链接丫只能超级管理员访问等等,实现方式也有多种多样,控制的粒度也不一样. 以前刚学的时候,不会框架,大都是手写注解+过滤器来进行权限的控制,但这样增加了过滤器的负担.用起来也会稍微有些麻烦,粒度不太好控制. 用框架的话,就是封装了更多的操作,让一切更简单吧.当然不局限于Security,还有像Shiro安全框架,这两种非常常见. 一起加油吧!

  • spring boot只需两步优雅整合activiti示例解析

    目录 前言 springboot整合activiti只需两步 1.添加boot的activiti模块 2.添加你的流程图文件 增强你的activiti,发布restful管理activiti resource 1.添加依赖 2.添加用户组以及用户,只有验证通过才能管理activiti 增强你的activiti,发布restful管理boot应用 1.添加依赖 2.相关接口信息 前言 本文描述的是怎么将activiti优雅的整合进你的spring boot应用,并增强你的activiti管理功能,

  • SpringBoot整合数据库访问层的实战

    目录 一.springboot整合使用JdbcTemplate 1.pom依赖 2.application.yml新增配置 3.建表sql 4.UserService 5.浏览器访问 二.整合mybatis框架查询 1.pom依赖 2.实体类UserEntity 3.UserMapper接口 4.UserService 5.app启动 三.整合mybatis框架插入 1.UserMapper添加insertUser 2.UserService添加insertUserMybatis 一.sprin

随机推荐