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.注入对象

  @Autowiredprivate RepositoryService repositoryService;@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;

4.部署流程

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

5.启动流程

   private static final String cookerIdList = "cookerIdList";@Testvoid 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";@Testvoid 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");}@Testvoid completeFirsCreate() {Task task = taskService.createTaskQuery().taskAssignee("jmj").list().get(0);taskService.complete(task.getId());}@Testvoid 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());}}@Testvoid 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的局部流程变量,这应该是实例作用域");//执行器}@Testvoid completeSubTask() {Map<String, Object> map = new HashMap<>();map.put("测试是什么位置的", 1);taskService.complete("95e204a4-3cd6-11ef-b405-005056c00008", map);//map是最外层的流程变量}@Testvoid q() {Task task = taskService.createTaskQuery().taskId("95e204a4-3cd6-11ef-b405-005056c00008").singleResult();//执行完一个任务就不存在了System.out.println(task);}//作用域 任务id>执行器>实例@Testvoid 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.如何废弃一个流程

  @Testvoid 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.rhkb.cn/news/371779.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang验证Etherscan上的智能合约

文章目录 golang验证Etherscan上的智能合约为什么要验证智能合约如何使用golang去验证合约获取EtherscanAPI密钥Verify Source Code接口Check Source Code Verification Status接口演示示例及注意事项网络问题无法调用Etherscan接口&#xff08;最重要的步骤&#xff09; golan…

ArcGIS实战—等高线绘制

今天分享一个使用ArcGIS Pro制作等高线地图的教程&#xff0c;等高线是用来表达地形最常见的形式之一。那么如何制作一个效果比较好的等高线地形图呢&#xff1f;让我们开始今天的教程。 1 DEM数据 第一步&#xff1a;获取DEM地形数据&#xff0c;网址&#xff08;https://dwt…

6、Redis系统-数据结构-05-整数

五、整数集合&#xff08;Intset&#xff09; 整数集合是 Redis 中 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素&#xff0c;并且元素数量不大时&#xff0c;就会使用整数集合这个数据结构作为底层实现。整数集合通过紧凑的内存布局和升级机制&#xff0c;实现了…

深度学习图像生成与分割模型详解:从StyleGAN到PSPNet

文章目录 Style GANDeeplab-v3FCNAdversarial AutoencodersHigh-Resolution Image Synthesis with Latent Diffusion ModelsNeRF: Representing Scenes as Neural Radiance Fields for View SynthesisPyramid Scene Parsing Network Style GAN 输入是一个潜在向量 (z)&#xff…

项目收获总结--MyBatis的知识收获

一、概述 最近几天公司项目开发上线完成&#xff0c;做个收获总结吧~ 今天记录MyBatis的收获和提升。 二、获取自动生成的(主)键值 insert 方法总是返回一个 int 值 &#xff0c;这个值代表的是插入的行数。若表的主键id采用自增长策略&#xff0c;自动生成的键值在 insert…

【JSP+Servlet+Maven】——优质外卖订餐系统之概论部分

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

详解基于业权一体化的统一授权中心架构设计,附材料打包

有群友问统一授权架构体系相关内容&#xff0c;统一授权体系隶属技术架构范畴&#xff0c;一般技术人员使用开源组件实现&#xff0c;很少在企业级层面讨论纯技术方案&#xff0c;但会讨论到“业权一体化”。 &#xff08;一&#xff09;权限管理和业权一体化的联系和区别 权…

哈喽GPT-4o,程序员如何通过GPT-4o提高工作效率

目录 一、编写代码Prompt&#xff1a;请用Java语言编写一个二分查找的样例 二、修正代码错误、代码优化Prompt&#xff1a;我们上传一张华为OD算法题的题目描述&#xff0c;再给它我的Java解题代码&#xff0c;问问它有什么问题&#xff1f; 三、解读代码功能、代码翻译Prompt&…

Docker——简介、安装(Ubuntu22.04)

1、简介 Docker 是一个开源的容器化平台&#xff0c;旨在简化应用程序的开发、交付和运行。它通过将应用程序及其所有依赖项打包到一个称为容器的标准化单元中&#xff0c;使应用程序能够在任何环境中一致地运行。Docker 解决了“在我的机器上能运行”的问题&#xff0c;使开发…

2008-2021年各省份高技术产业科研与发展(RD)活动情况数据

R&D&#xff08;研究与发展&#xff09;活动是推动国家和公司技术创新和经济增长的关键因素。以下是对各省份高技术产业科研与发展&#xff08;R&D&#xff09;活动情况数据的介绍&#xff1a; 数据简介 定义&#xff1a;R&D指在产品开发、工艺设计、生产技术改进…

MySQL的慢sql

什么是慢sql 每执行一次sql&#xff0c;数据库除了会返回执行结果以外&#xff0c;还会返回sql执行耗时&#xff0c;以mysql数据库为例&#xff0c;当我们开启了慢sql监控开关后&#xff0c;默认配置下&#xff0c;当sql的执行时间大于10s&#xff0c;会被记录到慢sql的日志文件…

人脸检测(Python)

目录 环境&#xff1a; 初始化摄像头&#xff1a; 初始化FaceDetector对象&#xff1a; 获取摄像头帧&#xff1a; 获取数据&#xff1a; 绘制数据&#xff1a; 显示图像&#xff1a; 完整代码&#xff1a; 环境&#xff1a; cvzone库&#xff1a;cvzone是一个基于…

RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录 1、引入 2、Fanout交换机 案例&#xff1a;利用SpringAMQP演示Fanout交换机的使用 3、Direct交换机 案例&#xff1a;利用SpringAMQP演示Direct交换机的使用 4、Topic交换机 案例&#xff1a;利用SpringAMQP演示Topic交换机的使用 1、引入 真实的生产环境都会经过e…

【论文阅读】VASA-1: Lifelike Audio-Driven Talking FacesGenerated in Real Time

整体框架。不直接生成视频帧&#xff0c;而是在潜在空间中生成整体面部动态和头部运动&#xff0c;条件是音频和其他信号。给定这些运动潜在编码&#xff0c;通过面部解码器生成视频帧&#xff0c;还接受从输入图像中提取的外观和身份特征作为输入。 构建了一个面部潜在空间并…

大连外贸建站公司wordpress主题模板

Robonaut萝卜纳特WP外贸站模板 适合用于工业机器人公司出口做外贸搭建公司官方网站使用的WordPress模板。 https://www.jianzhanpress.com/?p7091 优衣裳WordPress外贸建站模板 简洁的wordpress外贸独立站模板&#xff0c;适合服装、衣服、制衣外贸公司搭建公司官方网站使用…

视频翻译英文的软件有哪些?打破语言障碍就用这5个

打算趁着暑假假期悄悄努力惊艳所有人的小伙伴在哪呢~ 相信不少朋友自学都会首选在家看网课&#xff0c;不过有时候面对全英的外语课程&#xff0c;难免总会听得一头雾水~ 但其实这个问题很好解决&#xff01;码好以下这5款视频翻译工具&#xff0c;语言障碍的问题也就都迎刃而…

打破中国算力瓶颈的暴雨模式

6月27日&#xff0c;一场汇聚政府领导、人工智能领域顶尖专家学者和行业领军代表的高峰论坛—“算力中国高峰论坛”在北京清华科技园紫荆会议中心盛大举行。本次论坛由庆阳市人民政府、甘肃省人工智能与算力技术重点实验室共同举办&#xff0c;旨在加快探索科技前沿&#xff0c…

Python 算法交易实验76 QTV200日常推进

说明 最近实在太忙&#xff0c; 没太有空推进这个项目&#xff0c;我想还是尽量抽一点点时间推进具体的工程&#xff0c;然后更多的还是用碎片化的时间从整体上对qtv200进行设计完善。有些结构的问题其实是需要理清的&#xff0c;例如&#xff1a; 1 要先基于原始数据进行描述…

下载linux的吐槽

本来这几天放假了&#xff0c;想下一个linux玩一玩 教程&#xff08;我就是根据这个教程进行下载的&#xff0c;但是呢在进行修改BIOS 模式的 地方遇见了困难&#xff0c;也许是电脑修过的原因&#xff0c;我狂按F12 以及 FnF12都没有BIOS设置&#xff0c;只有一个让我选择用w…

puppeteer 爬虫初探

1. puppeteer 和 puppeteer-core 安装 puppeteer 会默认下载一个最新版本的 chrome 浏览器&#xff1b; 安装 puppeteer-core &#xff0c;不会安装 chrome, 若要程序打开浏览器运行时&#xff0c;需手动指定电脑系统安装的 chrome 浏览器路径&#xff1b; 2. puppeteer-core …