camunda最终章-springboot

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,因为就是流程本身),两个框框执行器(继承多实例子流程体),两个子流程执行器(分别继承框框执行器)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ComfyUI+MuseV+MuseTalk图片数字人

电脑配置 GPU12G&#xff0c;如果自己电脑配置不够&#xff0c;选择云gpu&#xff0c;我就是用的这个&#xff0c;自己电脑太老配置跟不上 环境&#xff1a; Python 3.11.8 torch 2.2.1 cuda_12.1 资源提供&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1_idZbF…

开始Linux之路(暑假提升)

人生得一知己足矣&#xff0c;斯世当以同怀视之。——鲁迅 Linux操作系统简单操作指令 1、ls指令2、pwd命令3、cd指令4、mkdir指令(重要)5、whoami命令6、创建一个普通用户7、重新认识指令8、which指令9、alias命令10、touch指令11、rmdir指令 及 rm指令(重要)12、man指令(重要…

【视频】R语言广义加性模型GAMs非线性效应、比较分析草种耐寒性实验数据可视化

全文链接&#xff1a;https://tecdat.cn/?p36979 原文出处&#xff1a;拓端数据部落公众号 广义加法模型&#xff08;Generalized Additive Models, GAMs&#xff09;作为一种高度灵活的统计工具&#xff0c;显著扩展了广义线性模型&#xff08;Generalized Linear Models, …

C基础day9

一、思维导图 二、课后练习 1> 使用递归实现 求 n 的 k 次方 #include<myhead.h>int Pow(int n,int k) {if(k 0 ) //递归出口{return 1;}else{return n*Pow(n,k-1); //递归主体} }int main(int argc, const char *argv[]) {int n0,k0;printf("请输入n和k:&…

Python统计实战:时间序列分析之绘制观测值图和按年折叠图

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 &#xff08;以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。&#xff09; 练习题 下表是某地区2…

复杂度(上卷)

前言 在正式进入今天的主题之前&#xff0c;我们不妨先来回顾一下初步学习数据结构后必须知道的概念。&#x1f3b6; 数据结构 数据结构是计算机存储、组织数据的方式&#xff0c;指相互间存在一种或多种特定关系的数据元素的集合。 &#xff08;没有一种单一的数据结构能够…

如何保证RocketMQ消息不丢失

rocket mq在生产阶段、Brocker存储阶段、消费阶段都会出现消息丢失。 1、生产者防止丢失消息。 a.同步阻塞的方式发送消息&#xff0c;加上失败重试机制&#xff0c;可能broker存储失败&#xff0c;可以通过查询确认 b.异步发送需要重写回调方法&#xff0c;检查发送结果 c…

人脸表情识别Facial Expression Recognition基于Python3和Keras2(TensorFlow后端)

人脸表情识别项目是一个结合了计算机视觉和深度学习技术的高级应用&#xff0c;主要用于分析和理解人类面部表情所传达的情感状态。这样的系统可以用于多种场景&#xff0c;比如情绪分析、用户交互、市场调研、医疗诊断以及人机接口等领域。 一个典型的人脸表情识别项目可以分…

kafka与zookeeper的SSL认证教程

作者 乐维社区&#xff08;forum.lwops.cn&#xff09;许远 在构建现代的分布式系统时&#xff0c;确保数据传输的安全性至关重要。Apache Kafka 和 Zookeeper 作为流行的分布式消息队列和协调服务&#xff0c;提供了SSL&#xff08;Secure Sockets Layer&#xff09;认证机制&…

红酒与威士忌:跨界碰撞的味觉火花

在品酒的世界里&#xff0c;红酒与威士忌&#xff0c;两者如同两位优雅的舞者&#xff0c;各自在舞台上闪耀着不同的光芒。然而&#xff0c;当它们相遇&#xff0c;那跨界碰撞的味觉火花&#xff0c;却仿佛一场不可预测的华丽盛宴&#xff0c;让人为之倾倒。 一、红酒的浪漫与威…

测试狗:“微观结构表征+理论计算”助力《Science》论文发表

特大喜讯&#xff1a;祝贺四川大学王玉忠院士&#xff0c;赵海波教授&#xff0c;马健文硕士研究生&#xff08;第一作者&#xff09;在《Science》上发表新的研究成果&#xff0c;测试狗和计算狗分别提供了SEM、Micro-CT、FTIR和理论计算支持&#xff0c;供相关领域的科研工作…

【经典面试题】环形链表

1.环形链表oj 2. oj解法 利用快慢指针&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

centos9中mysql指令提示解决方案

CentOS 9 中没有 MySQL 的官方插件&#xff0c;因为 MySQL 不是 CentOS 的默认数据库&#xff0c;它是 MariaDB 的一部分。 如果想要一个命令行提示的 MySQL 客户端&#xff0c;可以使用第三方工具 &#xff0c;如mycli 首先&#xff0c;确保已经安装了 MySQL&#xff0c;且操…

【C语言】C语言-身份证管理系统(源码+注释)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Java链表LinkedList经典题目

一.LinkedList的方法 首先先看一下链表的方法&#xff1a; 方法解释boolean add(E e)尾插void add(int index, E element)将 e 插入到 index 位置boolean addAll(Collection c)尾插 c 中的元素E remove(int index)删除 index 位置元素boolean remove(Object o)删除遇到的第一…

【7.10更新】Win11 23H2 正式版:22631.3880镜像下载!

微软向Win11 23H2用户推送了七月最新更新补丁KB5040442&#xff0c;系统更新后&#xff0c;版本号将升至22631.3880。本次更新包括了一些安全质量更新&#xff0c;并修复了6月可选更新导致的任务栏无法加载、交互问题&#xff0c;建议大家更新。该版本系统离线制作而成&#xf…

Spring MVC入门2

Postman的使用 接上期我们抛出了一个问题&#xff0c;Postman的使用 可以点击链接下载 https://www.postman.com/downloads/ 安装之后会提示版本升级&#xff0c;直接点击dissmiss即可。 要想发送数据&#xff0c;具体歩奏如下简图&#xff1a; 还有一个更具体的图&#xff…

回归树模型

目录 一、回归树模型vs决策树模型&#xff1a;二、回归树模型的叶结点&#xff1a;三、如何决定每个非叶结点上的特征类型&#xff1a; 本文只介绍回归树模型与决策树模型的区别。如需了解完整的理论&#xff0c;请看链接&#xff1a;决策树模型笔记 一、回归树模型vs决策树模…

jpg图片怎么转成png格式?学会这四种方法,轻松完成图片转换!

jpg图片怎么转成png格式&#xff1f;在数字图像的广袤天地中&#xff0c;JPG与PNG两大格式如同两位各具魅力的艺术家&#xff0c;各自以其独特的风格赢得了人们的喜爱&#xff0c;JPG擅长运用有损压缩的技法&#xff0c;以牺牲部分图像细节为代价&#xff0c;打造出更小巧、更易…

卤味江湖中,周黑鸭究竟该抓住什么赛点?

近年来&#xff0c;卤味江湖的决斗从未停止。 随着休闲卤味、佐餐卤味等细分赛道逐渐形成&#xff0c;“卤味三巨头”&#xff08;周黑鸭、绝味食品、煌上煌&#xff09;的牌桌上有了更多新对手&#xff0c;赛道变挤了&#xff0c;“周黑鸭们”也到了转型关键期。 这个夏天&a…