camunda最终章-springboot

news2024/11/15 11:18:18

1.实现并行流子流程

1.画图

 2.创建实体

package com.jmj.camunda7test.subProcess.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Cooker implements Serializable {

    public static final List<Cooker> repositoryCooker = new ArrayList();
    static {
        repositoryCooker.add(new Cooker("1","张三"));
        repositoryCooker.add(new Cooker("2","李四"));
    }

    private String cookerId;

    private String cookerName;


}
package com.jmj.camunda7test.subProcess.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dish implements Serializable {

    public static final List<Dish> repositoryDish = new ArrayList();
    public static final Map<String,List<Dish>> relationDish = new HashMap<>();
    static {
        Dish dish1 = new Dish("1", "番茄炒蛋");
        Dish dish2 = new Dish("2", "青椒炒肉");
        Dish dish3 = new Dish("3", "蚂蚁上树");
        Dish dish4 = new Dish("4", "蛋炒饭");
        Dish dish5 = new Dish("5", "锅包肉");
        repositoryDish.add(dish1);
        repositoryDish.add(dish2);
        repositoryDish.add(dish3);
        repositoryDish.add(dish4);
        repositoryDish.add(dish5);

        relationDish.put("1",new ArrayList<>(){
            {
                add(dish1);
                add(dish2);
                add(dish3);
            }
        });

        relationDish.put("2",new ArrayList<>(){
            {
                add(dish4);
                add(dish5);
            }
        });



    }




    private String dishId;

    private String dishName;
}

3.注入对象

  @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;

4.部署流程

    @Test
    void depoly() {
        repositoryService.createDeployment()
                .name("做菜流程").addClasspathResource("bpmn/做菜流程.bpmn")//绑定需要部署的流程文件
                .enableDuplicateFiltering(true)
                .deploy();

    }

5.启动流程

   private static final String cookerIdList = "cookerIdList";

    @Test
    void createProcess() {
        Map<String, Object> map = new HashMap<>();
        map.put(cookerIdList, Cooker.repositoryCooker);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("chi-fan-process", "chi-fan", map);
        System.out.println("流程启动成功: 流程实例ID=" + processInstance.getProcessInstanceId());

        String processInstanceId = processInstance.getProcessInstanceId();

        Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
        System.out.println("生成的任务Id:" + task.getId() + "任务名:" + task.getName());

        taskService.claim(task.getId(), "jmj");
        System.out.println("将任务委托给jmj");
    }

6.一系列执行


    private static final String jmj = "jmj";

    @Test
    void queryTaskInfo() {
        Task task = taskService.createTaskQuery().taskAssignee("jmj").list().get(0);
        System.out.println("任务是否处于悬停状态:" + task.isSuspended());
        System.out.println("设置任务一些参数");
        String id = task.getId();
        String processInstanceId = task.getProcessInstanceId();
        //那两个方法实际是一样的
//        runtimeService.setVariableLocal(processInstanceId,"local","jaa");

        taskService.setVariableLocal(id, "localTask", "bbb");

    }

    @Test
    void completeFirsCreate() {
        Task task = taskService.createTaskQuery().taskAssignee("jmj").list().get(0);

        taskService.complete(task.getId());

    }

    @Test
    void subExecutionQuery() {
        List<Execution> list = runtimeService.createExecutionQuery().processDefinitionKey("chi-fan-process").list();
        for (Execution execution : list) {
            System.out.println(execution.isEnded());
            System.out.println(execution.isSuspended());
            System.out.println(execution.getId());
        }

    }

    @Test
    void subTaskQuery() {
        Cooker cooker = Cooker.repositoryCooker.get(0);
        String cookerId = cooker.getCookerId();
        List<Task> list = taskService.createTaskQuery().taskAssignee(cookerId).processDefinitionKey("chi-fan-process").list();
        for (Task task : list) {
            String id = task.getId();
            String name = task.getName();
            String assignee = task.getAssignee();
            System.out.println(id + " " + name + " " + assignee);
        }
        List<Dish> dishes = Dish.relationDish.get(cookerId);
        System.out.println(dishes);

        Task task = list.get(0);
        String id = task.getId();

//        Map<String, Object> variables = taskService.getVariables(id);
        Map<String, Object> variables = runtimeService.getVariables(task.getExecutionId());
        System.out.println("所有的流程变量:" + variables.size());
        variables.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });

        //给的是实例就是全局 给的是执行器就是 局部
        runtimeService.setVariable("123", "subtaskxTask", "这应该是执行器的作用域3");//全局

//        Object subtaskxTask = runtimeService.getVariable(task.getProcessInstanceId(), "subtaskxTask");
//        System.out.println(subtaskxTask);//3
//        Object subtaskxTask1 = runtimeService.getVariable(task.getExecutionId(), "subtaskxTask");
//        System.out.println(subtaskxTask1);//1
//        taskService.setVariable(id,"subtask2Task2","测试子任务2的局部流程变量,这应该是实例作用域");//执行器
    }

    @Test
    void completeSubTask() {
        Map<String, Object> map = new HashMap<>();
        map.put("测试是什么位置的", 1);
        taskService.complete("95e204a4-3cd6-11ef-b405-005056c00008", map);//map是最外层的流程变量

    }

    @Test
    void q() {
        Task task = taskService.createTaskQuery().taskId("95e204a4-3cd6-11ef-b405-005056c00008").singleResult();//执行完一个任务就不存在了
        System.out.println(task);
    }


    //作用域 任务id>执行器>实例
    @Test
    void querySubExecutionId() {
        Cooker cooker = Cooker.repositoryCooker.get(0);
        String cookerId = cooker.getCookerId();
        List<Task> list = taskService.createTaskQuery().taskAssignee(cookerId).processDefinitionKey("chi-fan-process").list();
        Task task = list.get(0);

        Map<String, Object> variables = taskService.getVariables(task.getId());
        System.out.println(variables.size());
        variables.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });

//        taskService.setVariableLocal(task.getId(),"tset","测试局部任务作用域");//作用域ID为taskId //代表当前任务
//        runtimeService.setVariableLocal(task.getExecutionId(),"tset","测试局部任务作用域12");//作用域ID为executeId 执行器代表当前流程

        //子流程的一级父类的变量需要等所有子流程结束后,才会消失 二级执行器就是一个流程执行完生命周期,就消失

        taskService.complete(task.getId());//只会去除任务ID作用域下的变量

        //执行器ID等于流程实例ID
    }
    //任务ID 可以拿到当前流程的执行器ID

2.如何废弃一个流程

  @Test
    void deleteAnProcess() {
        runtimeService.deleteProcessInstance("31a61f25-3cf1-11ef-b3cd-005056c00008","测试删除");
    }

3.总结

  1. 关于作用域有三种,其一是 父流程实例作用域,其二子流程实例作用域,最后是任务作用域,三种作用域,从前往后,后面的作用域可以获取前面的作用域的流程变量,而前面的不能获取后面的流程变量
  2. 流程实例ID其实就等于执行器ID,在一个任务下,给执行器ID作作用域,其实就是给当前流程实例作全局变量。
  3. runtimeService与taskService里 getVariable 与 getVariableLocal 的区别,前者的参数是执行器ID,也就当前流程作用域下的变量,如果没有子流程,则就是获取全局的流程变量,如果有子流程,就是获取子流程与父流程所拥有的流程变量,而 getVariableLocal 仅仅获取此作用域下的变量,不会拿到父类作用域下的变量。同理 taskService  getVariable  是拿当前任务作用域 以及当前子流程作用域 以及父流程作用域下的全局变量, getVariableLocal只是获取当前任务作用域下的变量。
  4. 作用域下如果有相同名字的变量,则会拿到离自己作用域最近的值。
  5. 子流程获取不到另一个子流程的流程变量,若要互相传递参数,则可以放入父流程的全局变量
  6. claim方法其实和 setAssignee 差不多,区别就是, setAssignee可以用无限次,而claim设定以后,再次设定就会报错,设置了Assignee就相当于设置了claim。
  7. 子流程他其实创建的时候,会先创建多实例子流程体,然后每个子流程实例会有一个框框执行器,框框执行器继承多实例子流程体,框框执行器里面才是执行流程体,这个框框执行器就是给每个子流程放入子流程独立的全局变量(传入集合参数)用的。  若两个子流程,会创建一个实例执行器(没有父ID,因为就是流程本身),两个框框执行器(继承多实例子流程体),两个子流程执行器(分别继承框框执行器)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打卡第6天----哈希表

每天进步一点点,滴水石穿,日积月累,不断提升。 数组和链表章节告一段落。开启哈希表相关的。 哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里 一、有效的字母异位词 leetcode题目编号:242 题目描述: 给定两个字符串 s 和 t ,编写一个函数…

压测引擎数据库设计(上)

压测引擎数据库设计&#xff08;上&#xff09; 引言 在当今快速发展的互联网时代&#xff0c;软件质量保证和性能测试变得尤为重要。自动化测试平台&#xff0c;提供了一套完整的解决方案&#xff0c;以确保软件产品在发布前能够满足性能和稳定性的要求。本文将深入探讨滴云自…

【AutoencoderKL】基于stable-diffusion-v1.4的vae对图像重构

模型地址&#xff1a;https://huggingface.co/CompVis/stable-diffusion-v1-4/tree/main/vae 主要参考:Using-Stable-Diffusion-VAE-to-encode-satellite-images sd1.4 vae 下载到本地 from diffusers import AutoencoderKL from PIL import Image import torch import to…

RIP环境下的MGRE网络

首先将LSP的IP地址进行配置 其他端口也进行同样的配置 将serial3/0/1配置25.0.0.2 24 将serial4/0/0配置35.0.0.2 24 将GE0/0/0配置45.0.0.2 24 进行第二步 R1与R5之间使用ppp的pap认证 在R5中进行配置 在aaa空间中创建账号和密码 将这个账号和密码使用在ppp协议中 然后…

【信息学奥赛】CSP-J/S初赛07 逻辑运算符与位运算

本专栏&#x1f449;CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容&#xff0c;包含计算机基础、初赛常考的C程序和算法以及数据结构&#xff0c;并收集了近年真题以作参考。 如果你想参加信息学奥赛&#xff0c;但之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#…

BP神经网络的实践经验

目录 一、BP神经网络基础知识 1.BP神经网络 2.隐含层选取 3.激活函数 4.正向传递 5.反向传播 6.不拟合与过拟合 二、BP神经网络设计流程 1.数据处理 2.网络搭建 3.网络运行过程 三、BP神经网络优缺点与改进方案 1.BP神经网络的优缺点 2.改进方案 一、BP神经网络基…

C# modbus验证

窗体 还有添加的serialPort控件串口通信 设置程序配置 namespace CRC {public static class CRC16{/// <summary>/// CRC校验&#xff0c;参数data为byte数组/// </summary>/// <param name"data">校验数据&#xff0c;字节数组</param>///…

Nginx:负载均衡小专题

运维专题 Nginx&#xff1a;负载均衡小专题 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/…

docker nginx mysql redis

启动没有数据卷的nginx docker run -d -p 86:80 --name my-nginx nginx把/etc/nginx中的配置复制到宿主机 docker cp my-nginx:/etc/nginx /home/nginxlkl把/html 中的文件复制到宿主机 docker cp my-nginx:/etc/nginx /home/nginxlkl删除当前镜像 docker rm -f my-nginx重新起…

鸿蒙语言基础类库:【@ohos.uri (URI字符串解析)】

URI字符串解析 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…

汇川CodeSysPLC教程 Modbus变量编址

线圈&#xff1a;位变量&#xff0c;只有两种状态0和1。汇川PLC中包含Q区及SM区等变量。 寄存器&#xff1a;16位&#xff08;字&#xff09;变量&#xff0c;本PLC中包含M区及SD区等变量 说明&#xff1a; 汇川HMI的专用协议使用不同功能码&#xff1a;在访问SM时&#xff0c…

论文阅读 - Intriguing properties of neural networks

Intriguing properties of neural networks 经典论文、对抗样本领域的开山之作 发布时间&#xff1a;2014 论文链接: https://arxiv.org/pdf/1312.6199.pdf 作者&#xff1a;Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow,…

第二证券股市资讯:深夜!突然暴涨75%!

一则重磅收买引发医药圈轰动。 北京时间7月8日晚间&#xff0c;美股开盘后&#xff0c;美国生物制药公司Morphic股价一度暴升超75%。音讯面上&#xff0c;生物医药巨子礼来公司官宣&#xff0c;将以57美元/股的价格现金收买Morphic&#xff0c;较上星期五的收盘价溢价79%&…

昇思MindSpore学习笔记6-01LLM原理和实践--FCN图像语义分割

摘要&#xff1a; 记录MindSpore AI框架使用FCN全卷积网络理解图像进行图像语议分割的过程、步骤和方法。包括环境准备、下载数据集、数据集加载和预处理、构建网络、训练准备、模型训练、模型评估、模型推理等。 一、概念 1.语义分割 图像语义分割 semantic segmentation …

ARCGIS PRO 要素标注

一、普通模式 1、标注&#xff1a;名称和面积&#xff08;无分数线&#xff09; 语言&#xff1a;Arcade $feature.QLR \nRound($feature.Shape_Area,2) 语言&#xff1a;vbscript [QLR] & " " & Round([Shape_Area],2) 2、标注&#xff1a;名称…

Leetcode 295.数据流的中位数

295.数据流的中位数 问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: Media…

redis运维:sentinel模式如何查看所有从节点

1. 连接到sentinel redis-cli -h sentinel_host -p sentinel_port如&#xff1a; redis-cli -h {域名} -p 200182. 发现Redis主服务器 连接到哨兵后&#xff0c;我们可以使用SENTINEL get-master-addr-by-name命令来获取当前的Redis主服务器的地址。 SENTINEL get-master-a…

STM32对数码管显示的控制

1、在项目开发过程中会遇到STM32控制的数码管显示应用&#xff0c;这里以四位共阴极数码管显示控制为例讲解&#xff1b;这里采用的控制芯片为STM32F103RCT6。 2、首先要确定数码管的段选的8个引脚连接的单片机的引脚是哪8个&#xff0c;然后确认位选的4个引脚连接的单片机的4…

SpringBoot 启动流程六

SpringBoot启动流程六 这句话是创建一个上下文对象 就是最终返回的那个上下文 我们这个creatApplicationContext方法 是调用的这个方法 传入一个类型 我们通过打断点的方式 就可以看到context里面的东西 加载容器对象 当我们把依赖改成starter-web时 这个容器对象会进行…

【网络安全】对称加密算法

文章目录 非对称加密对称加密&#xff1a;Des 加密3 DES 加密Des 加密java ApiAES 加密算法AES 加密过程AES 密钥拓展 非对称加密 非对称加密算法需要两个密钥&#xff1a;公开密钥&#xff08;publickey:简称公钥&#xff09;和私有密钥&#xff08;privatekey:简称私钥&…