Activiti7学习笔记———activiti进阶

Activiti7学习笔记、非常详细 | 进阶篇 嘻嘻哈哈学技术 阅读详情

一、流程实例

1、通过Businesskey关联业务

    /**
     * 启动流程实例,添加businessKey
     */
    @Test
    public void addBusinessKey(){
//        1、得到ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、得到RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        3、启动流程实例,同时还要指定业务标识businessKey,也就是出差申请单id,这里是1001
        ProcessInstance processInstance = runtimeService.
                startProcessInstanceByKey("myFlow01","C00001");
//        4、输出processInstance相关属性
        System.out.println("业务id=="+processInstance.getBusinessKey());

    }

运行结果
在这里插入图片描述

这样创建的流程实例就能够根据自己实际业务系统的C00001业务相关联,而这个字段会被保存在act_ru_execution表的Businesskey字段中。
在这里插入图片描述

2、流程挂起

/**
     * 全部流程实例挂起与激活
     */
    @Test
    public void SuspendAllProcessInstance(){
//        获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        查询流程定义的对象
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().
                processDefinitionKey("myFlow01").
                singleResult();
//        得到当前流程定义的实例是否都为暂停状态(默认以查询到的第一个流程为标准)
        boolean suspended = processDefinition.isSuspended();
//        流程定义id
        String processDefinitionId = processDefinition.getId();
//        判断是否为暂停
        if(suspended){
//         如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间
            repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);
            System.out.println("流程定义----"+processDefinitionId+",已激活");
        }else{
//          如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间
            repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
            System.out.println("流程定义----"+processDefinitionId+",已挂起");
        }

    }

运行结果
在这里插入图片描述
在数据表中两个流程实例均被挂起
在这里插入图片描述
如果是要单个流程实例挂起则需要使用查询流程实例的ProcessInstanceQuery

/**
     * 单个流程实例挂起与激活
     */
    @Test
    public void SuspendSingleProcessInstance(){
//        获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        查询流程定义的对象
        ProcessInstance processInstance = runtimeService.
                createProcessInstanceQuery().
                processInstanceId("25001").
                singleResult();
//        得到当前流程定义的实例是否都为暂停状态
        boolean suspended = processInstance.isSuspended();
//        流程定义id
        String processDefinitionId = processInstance.getId();
//        判断是否为暂停
        if(suspended){
//         如果是暂停,可以执行激活操作 ,参数:流程定义id
            runtimeService.activateProcessInstanceById(processDefinitionId);
            System.out.println("流程定义:"+processDefinitionId+",已激活");
        }else{
//          如果是激活状态,可以暂停,参数:流程定义id
            runtimeService.suspendProcessInstanceById( processDefinitionId);
            System.out.println("流程定义:"+processDefinitionId+",已挂起");
        }

    }

运行结果
在这里插入图片描述
在这里插入图片描述

2、流程任务

1、流程任务的分配

在这里插入图片描述
方式一:直接输入

在这里插入图片描述

通过部署流程定义,启动流程实例后通过查询打印

    @Test
    public void testQueryTest(){
        String ass = "操作员01";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery().taskAssignee(ass).list();
        for (Task task:list)
            System.out.println(ass + "的任务名为" + task.getName() + "---" + task.getId());
    }

运行结果:
在这里插入图片描述
对应数据库中
在这里插入图片描述

方式二:UEL表达式
1、bpmn图输入表达式
在这里插入图片描述
2、在代码中分配

    /**
     * 设置流程负责人
     */
    @Test
    public void assigneeUEL(){
//      获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取 RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        设置assignee的取值,用户可以在界面上设置流程的执行
        Map<String,Object> assigneeMap = new HashMap<>();
        assigneeMap.put("assignee","张三");
//        启动流程实例,同时还要设置流程定义的assignee的值
        runtimeService.startProcessInstanceByKey("myFlow02",assigneeMap);
    }
}

通过方式一的代码获取任务
在这里插入图片描述
在这里插入图片描述
方式三:使用监听器
1、实现 org.activiti.engine.delegate.TaskListener 接口

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        if(delegateTask.getName().equals("")&&
                delegateTask.getEventName().equals("create")){
            //这里指定任务负责人
            delegateTask.setAssignee("张三");
        }
    }
} 

2、在bpmn图中设置我们写好的监听器(这里我插件出了问题,无法扩展)
在这里插入图片描述

2、任务关联 businessKey

通过获取任务对象的流程实例Id来获取流程实例中的businessKey,通过businessKey来获取业务数据库中的数据。

@Test
    public void findProcessInstance(){
//        获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取TaskService
        TaskService taskService = processEngine.getTaskService();
//        获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        查询流程定义的对象
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection1")
                .taskAssignee("张三")
                .singleResult();
//        使用task对象获取实例id
        String processInstanceId = task.getProcessInstanceId();
//          使用实例id,获取流程实例对象
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processInstanceId(processInstanceId)
                .singleResult();
//        使用processInstance,得到 businessKey
        String businessKey = processInstance.getBusinessKey();
        System.out.println("businessKey=="+businessKey);
    }

3、流程变量

1、流程变量作用域

globa变量

流程变量的默认作用域是流程实例。当一个流程变量的作用域为流程实例时,可以称为 global 变量

local变量

任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。

2、流程变量类型

在这里插入图片描述

3、使用流程变量控制流程

如定义该流程
在这里插入图片描述

1、在创建流程实例时设置流程变量
流程业务对象

/**
 * 自定义流程实例业务对象
 */
public class EventPOJO implements Serializable {
    //条件
    private Integer num;
    public Integer getNum() {
        return num;
    }
    public void setNum(Integer num) {
        this.num = num;
    }
}

在对流程实例部署之后启动流程实例中设置流程变量如果在bpmn中是以${eventPOJO.num < 3}设置条件的则用方式2来设置

    /**
     * 启动流程实例并定义流程变量
     */
    @Test
    public void testStartProcess02(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //创建自定义的流程业务对象
        EventPOJO eventPOJO = new EventPOJO();
        eventPOJO.setNum(1);
        //将设置的流程变量或是其他变量放入map
        Map<String, Object> map = new HashMap<>();
        //方式1
        map.put("num",1);
        //方式2(在以下的方式同理)
//        map.put("eventPOJO",eventPOJO);
        //        3、根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("myFlow04",map);
//        输出内容
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动Id:" + processInstance.getActivityId());
    }

接下来完成“事件01”后默认执行的就是“事件03”

在这里插入图片描述

2、在任务办理时设置流程变量
在部署和流程实例创建后

    @Test
    public void completTask() {
        //任务id
        String key = "myFlow04";
//        任务负责人
//      String assingee = "张三";
//       获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//       创建TaskService
        TaskService taskService = processEngine.getTaskService();
//       创建变量集合
        Map<String, Object> map = new HashMap<>();
//      定义流程变量
        map.put("num",4);
//        完成任务前,需要校验该负责人可以完成当前任务
//        校验方法:
//        根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
//              .taskAssignee(assingee)
                .singleResult();
        if(task != null){
            //完成任务是,设置流程变量的值
            taskService.complete(task.getId(),map);
            System.out.println("任务执行完成");
        }
    }

在办理事件01时设置流程变量为4,此时num>3则如bpmn图接下来要执行事件02
在这里插入图片描述

3、通过当前流程实例设置
通过流程实例id设置全局变量,该流程实例必须未执行完成。

    @Test
    public void setGlobalVariableByExecutionId(){
//    当前流程实例执行 id,通常设置为当前执行的流程实例
        String executionId="2601";
//     获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取RuntimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//      通过流程实例 id设置流程变量
        runtimeService.setVariable(executionId, "num", 1);
//      一次设置多个值
//      runtimeService.setVariables(executionId, variables)
    }

4、通过当前任务设置

@Test
	public void setGlobalVariableByTaskId(){
		//当前待办任务id
		String taskId="1404";
//     获取processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		//通过任务设置流程变量
		taskService.setVariable(taskId, "num", 1);
		//一次设置多个值 
		//taskService.setVariables(taskId, variables)
	}

5、local流程变量设置
只需通过TaskService对象的以下这个方法就可以设置

//  通过任务设置流程变量
    taskService.setVariableLocal(taskId, "num", 1);

4、组任务

在对组任务进行查询逻辑基本都与前面一致,无非是通过任务查询器TaskQuery来通过各种条件对于任务内容进行查询(这里是通过候选人进行任务的查询)。
拾取组任务

         //拾取任务 claim(要拾取的任务id,任务候选人id)
           taskService.claim(taskId, userId);

归还组任务、交接组任务
本质就是修改Assignee

       // 如果设置为null,归还组任务,该 任务没有负责人
       taskService.setAssignee(taskId, null);

5、网关

参考

activiti7(三):Activiti7简介与HelloWorld activiti7简介与helloworld,旨在学习activiti7的工作流程和原理 阅读详情

相关推荐

2024最新!Activiti7工作流进阶(深入浅出,拍案叫绝)

2024最新!Activiti7工作流进阶(深入浅出,拍案叫绝).工作流引擎,看这一篇足矣!

ManCxyster的博客 2395

Activiti流程变量

Activiti流程变量 设置流程变量 1.基本类型 public void setProcessVariables(){ /*正在执行的流程或者任务*/ RuntimeService runtimeService = processEngine.getRuntimeService(); TaskService taskService = pr...

桀骜浮沉的博客 382

Activiti7集成SpringBoot2官方实例

Activiti7集成SpringBoot2官方实例系列文章地址: https://www.xugj520.cn/category/Activiti/

高效码农 1万+

activiti之流程变量值Business_key

今天以请假为例,我们具体到我们的业务中来实现一下这个流程变量(Business_key)怎么用

ermuv5 1万+

SpringBoot 集成 Activiti 7 工作流引擎

初始库表、定义、部署、操作任务代码创建测试类// 创建 ProcessEngine 对象// /**// * 初始化数据库表:第一种方式// */// @Test// }/*** 初始化数据库表* 通过读取 activiti.cfg.xml 配置文件*/@Test/*** 流程部署*/@Test// 创建 ProcessEngine 对象// 获取 repositoryService 对象// 进行部署。

m0_74825502的博客 1489

同花顺自动化交易避坑指南:pywinauto实战中验证码识别与界面弹窗处理

本文深入探讨同花顺自动化交易中的关键稳定性问题,重点解决验证码识别与弹窗处理两大难题。通过优化Tesseract OCR、整合打码平台API以及设计pywinauto弹窗监控体系,提供了一套完整的自动化交易解决方案,帮助交易者有效规避资金账户和持仓信息操作中的常见陷阱。

weixin_33734785的博客 489

org.activiti.engine

org.activiti.engine是一个非常常见的需求。

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 1293

vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制

技术无关,独立开发,独立部署,增量升级,独立运行,微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用。

前端开发工程师 9751

activiti工作流

activiti使用流程 一.使用思路 整合Activiti 实现业务流程建模,使用BPMN实现业务流程图 部署业务流程到Activiti 启动流程实例 查询待办任务 处理待办任务 结束流程 二.idea安装actiBPM过程(安装Activiti Design 插件) ​ idea 中 找到安装plugins 因为2019以上的idea版本不能下载可参考 ​ https://blog.youkuaiyun.com/qq_34474636/article/detai

qq_28318313的博客 736

FreeRTOS任务调度实战:如何让STM32同时处理温湿度采集、OLED显示和云端通信

本文通过一个基于STM32的物联网终端项目,详细讲解了如何利用FreeRTOS实现多任务调度,同时处理温湿度采集、OLED显示和云端通信。文章深入探讨了任务规划、堆栈分配、信号量与消息队列等核心机制,并重点优化了ESP8266通信任务的非阻塞设计与稳定性,为构建响应迅速、运行可靠的嵌入式系统提供了实战指南。

weixin_29188043的博客 332

【ESP32】SPI SRAM memory test fail。External RAM failed memory test!

log日志报错如下:这两条报错信息表明外部 SPI SRAM(静态随机存取存储器)的内存测试失败。

weixin_56217406的博客 1024

Activiti7工作流 学习笔记

是一种按照预定义规则【需要符合BPMN规范】进行部署,将业务和节点的流程进行分离【特定形式进行关联】,实现节点的自动流转的工作流框架.1.需要将预定于的流程文件BPMN部署到工作流引擎中,会把节点,路径信息存储到数据库中.2.工作流引擎提供了大量的API对流程进行查询处理,细节都是对应用程序屏蔽的,大大提供开发效率3.业务逻辑的处理和流程的流转是分离的,是通过BusinessKey进行关联的.

weixin_46853502的博客 1078

在MDK5.37版本中添加Complier Version 5( 解决Missing Compiler Version 5 )

本文章仅作为个人学习记录,方法也是从其他博主的博客中得到的,链接如下:二、Keil——Missing Compiler Version 5 和 core_cm3.c 问题解决 - YI颗白菜 - 博客园 (cnblogs.com) 问题描述 更新最新的keil版本(MDK5.37)后,在编译以前版本的工程文件时,发现出现了非常多的报错,在网上搜索之后发现原来时编译器版本不匹配的问题,即MDK5.37中使用的是Version 6版本的编译器,而缺少Version 5,对于以前编写的工

leveling99的博客 1万+

activiti 7 进阶

在activiti实际应用时,查询流程实例列表时可能要显示出业务系统的一些相关信息,比如:查询当前运行的出差流程列表需要将出差单名称、出差天数等信息显示出来,出差天数等信息在业务系统中存在,而并没有在activiti数据库中存在,所以是无法通过activiti的api查询到出差天数等信息。在完成任务时设置流程变量,该流程变量只有在该任务完成后其它结点才可使用该变量,它的作用域是整个流程实例,如果设置的流程变量的key在流程实例中已存在相同的名字则后设置的变量替换前边设置的变量。业务标识来源于业务系统。

Edward的博客 1257

一文学会python基础知识

1. python 运行环境 1.1 脚本式环境 1.2 交互式环境 2. python 注释 3. 变量及变量命名 4. 关键词 BIFS 5. 标准操作符 6. 条件判断 7. 循环 8. python 数据类型 9. python 序列 9.1 序列-字符串(str) 9.2 序列-列表 9.3 序列-元组 10. 字典 11. 集合 12. python内存管理及可变、不可变对象 13. 函数 13.1 函数参数 13.2 return and yiled(生成器) 13.3 参数传递处理 ...

weixin_43178406的博客 26万+

013:无人机航线规划的概念

航线规划是无人机任务规划的核心环节,它决定了无人机在整个任务执行过程中的飞行路径。航线规划需要考虑多种因素,包括飞行时间、飞行距离、能源消耗、飞行安全等。

qq_31762031的博客 2444

SpringBoot整合Activiti7使用

最近做的一个项目中需要实现员工请假的功能,计划使用activiti来实现请假流程,所以去学习了一下相关的知识。并且完成了一个简单的请假实例。 Activiti相关 Activiti介绍 Activiti是基于Apache许可的开源BPM平台,创始人Tom Baeyens原是JBPM架构师,可以理解为与JBPM出自同一祖师爷。它提供了Eclipse插件,开发可以通过插件直接绘制业务流程图。基于Spring,ibatis等框架,并在此之上构建了非常清晰的开发框架。是由Alfresco软件发布的业务流程管理(BP

菜菜的博客 3万+

新手必读!2025最全AI智能体入门手册,50个问题全讲透

感知(Perception):能读取环境,比如读取网页数据、识别用户输入、接入 API;思考(Reasoning/Planning):理解任务目标,规划出行动步骤;行动(Action):调工具、查资料、发消息、写入数据库……直接执行任务。有了这三步,智能体才不是“一个会说话的大模型”,而是真正的“能落地执行的工作代理人”。多个 Agent 分工协作,每个智能体负责一个角色或任务节点,像一个“虚拟团队”。一个爬数据的 Agent,一个提炼要点的 Agent,一个撰写报告的 Agent,

互联网架构师笔记 1971

Activiti7工作流+SpringBoot

一、Activiti介绍: Activiti是基于Apache许可的开源BPM平台,创始人Tom Baeyens原是JBPM架构师,可以理解为与JBPM出自同一祖师爷。它提供了Eclipse插件,开发可以通过插件直接绘制业务流程图。基于Spring,ibatis等框架,并在此之上构建了非常清晰的开发框架。是由Alfresco软件发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务...

qq_40451631的博客 9万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Activiti7讲义

Activiti7 一、工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。 1.2 工作流系统 一个软件系统中具有工作流的功能,我们把它称为工作流系统,一个系统中工作流的功能是什么?就是对系统的业务流程进行自动化管理,所以工作流是建立在业务流程的基础上,所以一个软件的系统核心.........

m0_46509482的博客 6105

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Activiti7系列课程7-activiti7设计器

摘要:本文重点讲解一下Activiti7可以使用的流程设计器。目前Activiti最新版本是7.1.0.M1。 Activiti7可以使用的设计器 要想非常方便的使用Activiti7框架,则必须要安装流程设计器插件,关于Activiti7流程设计器相关插件说明如下: activiti6 官方提供有Web设计器(Modeler设计器)。这个不需要进行安装,直接部署运行activiti-model...

分享牛 4万+

Activiti7工作流介绍及使用

Activiti7工作流 一、工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。 案例: 出差费用报销 目标: 公司把出差费用转账到自己的账户中. 参与人: 申请人、部门主管、总经理、财务 ** ** 传递文件/执行任务 ** ** 什么是工作流系统? 一个软件系统中具有工作流的功能,我们把它称为工作流系统。 1.2 适

weixin_65599902的博客 3259

Activiti7工作流 二【Activiti7入门、Activiti7进阶】

Activiti7工作流 二【Activiti7入门、Activiti7进阶】

m0_52896752的博客 848

Activiti7的基础使用

核心(taskAssignee是画图的时候Assignee所填写的内容,正常为负责人名称)taskService.createTaskQuery().processDefinitionKey("Test2").taskAssignee("第一个节点").list();/***查询个人待执行的任务//1、获取流程引擎ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();............

LOVEUUZ的博客 5786

【Activiti7系列】Activi7简介和基于Spring Boot整合Activiti7(流程设计器)

本文将介绍Activiti7基础概念及基于SpringBoot整合Activiti7(流程设计器)的具体步骤。

c18213590220的博客 6566

Activiti7的用法和简述

Activiti7 简述: Activiti是一款工作流引擎,是业务流程管理(BPM)框架,最常用的是用在各种审批工作中,比如请假审批,采购审批 引进背景: 我们引入工作流是为了灵活多变的实行客户在提交订单时,获得上级认证通过的流程方式,采用流程图可以在不修改代码,不发布的前提下,满足客户的需求, 在上线初, 存在业务场景为“三不固定”审批: 节点不定:客户上级审批存在多个节点审批,一级复一级,节点不定 人员不定:一个节点审批存在多个人审批的情况,可一可众,人员不定 路线不定:同一个人下单,存在依据下单条件

一个记录的地方 9464
上一篇: Activiti7学习笔记———activiti基本介绍及使用
下一篇: dockerfile基本内容笔记
magicproblem
博客等级 码龄7年 22粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值