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.pswp.cn/web/44096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44096.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 | Leetcode C語言題解之第230題二叉搜索樹中第K小的元素

題目&#xff1a; 題解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int search_num(struct TreeNode* root, int k, int *result, int num) {if(num k 1){retu…

《Foundation 側邊欄》

《Foundation 側邊欄》 介紹 Foundation 是一個強大的前端框架,它提供了一套豐富的工具和組件,幫助開發者快速構建響應式、移動優先的網站和應用程序。在 Foundation 中,側邊欄是一個常用的組件,用于展示導航鏈接、菜單或其他相關信息。本文將詳細介紹如何在 Foundation …

FastGPT連接OneAI接入網絡模型

文章目錄 FastGPT連接OneAI接入網絡模型1.準備工作2.開始部署2.1下載 docker-compose.yml2.2修改docker-compose.yml里的參數 3.打開FastGPT添加模型3.1打開OneAPI3.2接入網絡模型3.3重啟服務 FastGPT連接OneAI接入網絡模型 1.準備工作 本文檔參考FastGPT的官方文檔 主機ip接…

JDBC 實例分享——簡易圖書管理系統

目錄 前言 數據表的建立 操作包各個類的實現 增加類 刪除類 展示類 借閱與歸還類 前言 書接上文 JDBC編程的學習——MYsql版本-CSDN博客 本期我們通過對先前圖書管理系統進行改造,是它的數據能保存在數據庫中 完整代碼我已經保存在github中,能不能給個星呢!!!! call…

記一次若依框架和Springboot常見報錯的實戰漏洞挖掘

目錄 前言 本次測實戰利用圖? 1.判段系統框架 2.登錄頁面功能點測試 2.1 弱口令 2.2 webpack泄露信息判斷 2.3 未授權接口信息發現 3.進一步測試發現新的若依測試點 3.1 默認弱口令 3.2 歷史漏洞 4.訪問8080端口發現spring經典爆粗 4.1 druid弱口令 4.2 SwaggerU…

熱鍵危機:揭秘Memcached中的熱鍵問題及其解決方案

熱鍵危機&#xff1a;揭秘Memcached中的熱鍵問題及其解決方案 Memcached是一種廣泛使用的高性能分布式內存緩存系統&#xff0c;它通過緩存數據來減少對后端數據庫的訪問壓力&#xff0c;從而提高應用性能。然而&#xff0c;Memcached也可能遇到熱鍵&#xff08;hot key&#…

淺析Kafka-Stream消息流式處理流程及原理

以下結合案例&#xff1a;統計消息中單詞出現次數&#xff0c;來測試并說明kafka消息流式處理的執行流程 Maven依賴 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

Okhttp實現原理

OkHttp 是一個高效的 HTTP 客戶端庫&#xff0c;廣泛應用于 Android 和 Java 應用中。它提供了簡潔的 API&#xff0c;支持多種協議&#xff0c;如 HTTP/1.x 和 HTTP/2&#xff0c;并且內置了緩存和重試機制。下面是結合源碼分析的 OkHttp 的實現原理&#xff1a; 核心組件 O…

Swift 數據類型

Swift 數據類型 Swift 是一種強類型語言,這意味著在 Swift 中聲明的每個變量和常量都必須具有明確的類型。Swift 的類型系統旨在幫助開發者編寫清晰、安全的代碼。本文將詳細介紹 Swift 中的基本數據類型,包括整數、浮點數、布爾值、字符和字符串。 整數類型 Swift 提供了…

音頻語言學習領域數據集現狀、分類及評估

Audio Language Learning (Audio-Text Learning) 是一個新興的研究領域&#xff0c;專注于處理、理解和描述聲音。它的發展動力是機器學習技術的進步以及越來越多地將聲音與其相應的文本描述相結合的數據集的可用性。 Audio Language Models (ALMs) 是這個領域的關鍵技術&#…

MATLAB中的SDPT3、LMILab、SeDuMi工具箱

MATLAB中的SDPT3、LMILab、SeDuMi工具箱都是用于解決特定數學優化問題的工具箱&#xff0c;它們在控制系統設計、機器學習、信號處理等領域有廣泛的應用。以下是對這三個工具箱的詳細介紹&#xff1a; 1. SDPT3工具箱 簡介&#xff1a; SDPT3&#xff08;Semidefinite Progra…

基于QT開發的反射內存小工具

前言 最近項目需要需要開發一個反射內存小工具&#xff0c;經過2天的修修改終于完成了。界面如下&#xff1a; 功能簡介 反射內存指定地址數據讀取反射內存指定地址數據寫入反射內存指定地址數據清理十進制、十六進制、二進制數據相互轉換 部分代碼 void RfmMain::setWOthe…

SqlSugar-使用SqlSugar進行多數據庫操作

使用SqlSugar進行多數據庫操作主要涉及以下幾個步驟&#xff1a; 1. 配置數據庫連接 首先&#xff0c;你需要在項目的配置文件中&#xff08;如appsettings.json、web.config或app.config&#xff09;配置多個數據庫的連接字符串。每個連接字符串都對應一個不同的數據庫。 例…

攻防世界(PHP過濾器過濾)file_include

轉換過濾器官方文檔&#xff1a;https://www.php.net/manual/zh/filters.convert.php#filters.convert.iconv 這道題因為convert.base64-encode被過濾掉了&#xff0c;所以使用convert.iconv.*過濾器 在激活 iconv 的前提下可以使用 convert.iconv.* 壓縮過濾器&#xff0c; 等…

Win10安裝MongoDB(詳細版)

文章目錄 1、安裝MongoDB Server1.1. 下載1.2. 安裝 2、手動安裝MongoDB Compass(GUI可視工具)2.1. 下載2.2.安裝 3、測試連接3.1.MongoDB Compass 連接3.2.使用Navicat連接 1、安裝MongoDB Server 1.1. 下載 官網下載地址 https://www.mongodb.com/try/download/community …

【第28章】MyBatis-Plus之插件主體

文章目錄 前言一、MybatisPlusInterceptor 概覽1. 屬性2. InnerInterceptor 接口 二、使用示例1.Spring 配置2.Spring Boot 配置3 .mybatis-config.xml 配置 三、攔截忽略注解 InterceptorIgnore四、手動設置攔截器忽略執行策略五、本地緩存 SQL 解析總結 前言 MyBatis-Plus 提…

android 固定圖片大小

在Android中&#xff0c;固定圖片大小可以通過多種方法實現&#xff0c;這些方法主要涉及到ImageView控件的使用、Bitmap類的操作&#xff0c;以及第三方庫&#xff08;如Glide&#xff09;的輔助。以下是幾種常見的方法&#xff1a; 1. 使用ImageView控件 在Android的布局文…

利用docker容器安裝node,使用vue的開發環境

目錄 vue-app ├── docker-data │ ├── site │ ├── app ├── docker-compose.yaml └── deploy.sh docker-compose.yaml yaml文件執行 version: 3.8services:node:image: node:latestcontainer_name: vue-appports:- "8080:8080" # 宿主8080映射容器8…

系統服務綜合項目

要求&#xff1a; 現有主機 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主機上提供 DNS 和 WEB 服務 2、dns 服務提供本實驗所有主機名解析 3、web服務提供 www.rhce.com 虛擬主機 4、該虛擬主機的documentroot目錄在 /nfs/rhce 目錄 5、該目錄由 no…

如何保證語音芯片的穩定性能和延長使用壽命

要讓語音芯片保持穩定性能&#xff0c;首先需要深入理解其工作原理和內部構造。語音芯片&#xff0c;作為現代電子設備中的核心組件之一&#xff0c;承載著聲音信號的處理與輸出功能。為了確保其穩定運行&#xff0c;我們需要從多個方面進行細致的考慮和操作。? 1、避免長期高…