activiti学习笔记

本文介绍了如何在SpringBoot项目中集成Activiti工作流引擎,包括依赖配置、数据库表的生成与更新、流程模板的创建与删除,以及流程实例的启动、查询和审批操作。还解决了UserDetailsService找不到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、初始化

1、依赖

    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring-boot-starter</artifactId>
        <version>7.0.0.Beta2</version>
    </dependency>

2配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/activiti?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
    username: root
    password: shen
    driver-class-name: com.mysql.jdbc.Driver
  activiti:
    #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
    #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
    #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
    #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
    database-schema-update: true
    #检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录
    db-history-used: true
    #记录历史等级 可配置的历史级别有none, activity, audit, full
    #none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
    #activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
    #audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
    #full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
    history-level: full
    #校验流程文件,默认校验resources下的processes文件夹里的流程文件
    check-process-definitions: false

问题

URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)

解决

3、生成acitivti需要的数据库表。

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;

public class TestDemo {
    /**
     * 生成 activiti的数据库表
     */
    @Test
    public void testCreateDbTable() {
        //使用classpath下的activiti.cfg.xml中的配置创建processEngine
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		System.out.println(processEngine);
    }
}

二、activiti 相关概念

1、表结构解读

1.1 前缀

ACT_RE :'RE'表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

ACT_RU:'RU'表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异 步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流 程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

ACT_HI:'HI'表示 history。 这些表包含历史数据,比如历史流程实例、变量,任务等等。 ACT_GE : GE 表示 general。 通用数据, 用于不同场景下

1.2 完整的数据库表作用:

表名解释
一般数据[ACT_GE_BYTEARRAY]通用的流程定义和流程资源(流程存到表中)
[ACT_GE_PROPERTY]系统相关属性
流程历史记录[ACT_HI_ACTINST]历史的流程实例(读流程开始到正在运行节点的所有节点,包括开始节点,结束节点等)
[ACT_HI_ATTACHMENT]历史的流程附件
[ACT_HI_COMMENT]历史的说明性信息
[ACT_HI_DETAIL]历史的流程运行中的细节信息
[ACT_HI_IDENTITYLINK]历史的流程运行过程中用户关系(开始到正在审批节点的审批人)
[ACT_HI_PROCINST]历史的流程实例
[ACT_HI_TASKINST]历史的任务实例(从开始到正在进行节点的用户)
[ACT_HI_VARINST]历史的流程运行中的变量信息
流程定义表[ACT_RE_DEPLOYMENT]部署单元信息(创建流程记录)
[ACT_RE_MODEL]模型信息(不重要)
[ACT_RE_PROCDEF]已部署的流程定义(流程key存放位置)
运行实例表[ACT_RU_EVENT_SUBSCR]
运行时事件
[ACT_RU_EXECUTION]
运行时流程执行实例
[ACT_RU_IDENTITYLINK]
运行时用户关系信息,存储任务节点与参与者的相关信息
[ACT_RU_JOB]运行时作业
[ACT_RU_TASK]运行时任务(当前节点)
[ACT_RU_VARIABLE]运行时变量表

2、主要使用接口、类

ProcessEngine:  流程引擎

ProcessEngineConfiguration: 读取流程引擎配置类

Service总览

RepositoryService
activiti的资源管理类
RuntimeService
activiti的流程运行管理类
TaskService
activiti的任务管理类
HistoryService
activiti的历史管理类
ManagerService
activiti的引擎管理类

RepositoryService

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

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

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

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

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

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

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

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

三、Spring boot 使用activiti

1、流程模板相关(流程定义)

1.1创建流程模板

    @Autowired
    private RepositoryService repositoryService;

    /**
     *  创建流程模板
     *  最要的是加载流程定义资源,addClasspathResource/addInputStream 都可以
     *  
     */
    public void create(){
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
                .name("需求预审流程")
                .deploy();
    }

  注:

 1、Deployment 中只有其中的key 重要,后面频繁用到

2、其中ACT_RE_PROCDEF 添加了流程key,ACT_RE_DEPLOYMENT记录添加记录,act_ge_bytearray 流程资源表 ,每个流程定义对应两个资源记录,bpmn 和png;

3、流程模板的key和name 在文件中设置,如果key重复会新建一个版本

1.2 删除流程模板

    /**
     *  删除流程模板
     */
    @Test
    public void delectFlow(){
        repositoryService.deleteDeployment("deploymentId");
    }

2、流程实例

2.1  启动流程实例

    @Autowired
    private RuntimeService runtimeService;


    public void runtime(){
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("myProcess_1");

        System.out.println(processInstance.getId());
    }

同时还可以指定业务标识businessKey和variables(流程中的参数可以传null),也就是出差申请单id (存在act_ru_execution  中的BUSINESS_KEY)

 ProcessInstance processInstance = runtimeService.
                startProcessInstanceByKey("myEvection","1001",variables);

2.2 查询待审批

    @Resource
    private TaskService taskService;

    /**
     *  查询待审批
     */
    @Test
    public void selectTask(){
        List<Task> list = taskService.createTaskQuery()
                .taskAssignee("taskService")//只查询该任务负责人的任务
                .list();

        System.out.println(list);
    }

2.3 完成审批

    @Resource
    private TaskService taskService;

    /**
     *  处理流程
     */
    @Test
    public void complete(){
        Task task = taskService.createTaskQuery().processInstanceId("流程实例id").taskAssignee("审批人id").singleResult();
        taskService.complete(task.getId());
    }

相关问题

1、Parameter 0 of method userGroupManager in org.activiti.core.common.spring.identity.config.ActivitiSpringIdentityAutoConfiguration required a bean of type 'org.springframework.security.core.userdetails.UserDetailsService' that could not be found.

解决:  往spring 中添加UserDetailsService

import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

@Configuration
public class UserDetailServiceImpl implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return null;
    }
}

参考:

SpringBoot集成activiti7报错处理之UserDetailsService that could not be found-CSDN博客

参考

工作流引擎 Activiti 入门

spring boot 集成

Activiti 进阶

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值