当前位置: 首页 > news >正文

flowable源码解读——并行多实例节点任务是否是顺序生成

 最近在项目开发中需要在多实例开始监听里修改一个全局的计数变量,不太确定并行多实例任务在底层引擎是顺序生成还是并行生成的,如果是顺序生成的则不影响,如果是并行生成 则修改一个全局的计数变量就会出现数据错误问题,查阅了flowable源码,做个记录。

查看并行多实例节点任务类 ParallelMultiInstanceBehavior,代码如下:
    protected int createInstances(DelegateExecution multiInstanceRootExecution) {int nrOfInstances = resolveNrOfInstances(multiInstanceRootExecution);if (nrOfInstances < 0) {throw new FlowableIllegalArgumentException("Invalid number of instances: must be non-negative integer value" + ", but was " + nrOfInstances);}setLoopVariable(multiInstanceRootExecution, NUMBER_OF_INSTANCES, nrOfInstances);setLoopVariable(multiInstanceRootExecution, NUMBER_OF_COMPLETED_INSTANCES, 0);setLoopVariable(multiInstanceRootExecution, NUMBER_OF_ACTIVE_INSTANCES, nrOfInstances);List<ExecutionEntity> concurrentExecutions = new ArrayList<>();for (int loopCounter = 0; loopCounter < nrOfInstances; loopCounter++) {ExecutionEntity concurrentExecution = CommandContextUtil.getExecutionEntityManager().createChildExecution((ExecutionEntity) multiInstanceRootExecution);concurrentExecution.setCurrentFlowElement(activity);concurrentExecution.setActive(true);concurrentExecution.setScope(false);concurrentExecutions.add(concurrentExecution);logLoopDetails(concurrentExecution, "initialized", loopCounter, 0, nrOfInstances, nrOfInstances);//CommandContextUtil.getHistoryManager().recordActivityStart(concurrentExecution);}// Before the activities are executed, all executions MUST be created up front// Do not try to merge this loop with the previous one, as it will lead// to bugs, due to possible child execution pruning.for (int loopCounter = 0; loopCounter < nrOfInstances; loopCounter++) {ExecutionEntity concurrentExecution = concurrentExecutions.get(loopCounter);// executions can be inactive, if instances are all automatics// (no-waitstate) and completionCondition has been met in the meantimeif (concurrentExecution.isActive() && !concurrentExecution.isEnded() && !concurrentExecution.getParent().isEnded()) {executeOriginalBehavior(concurrentExecution, (ExecutionEntity) multiInstanceRootExecution, loopCounter);} }// See ACT-1586: ExecutionQuery returns wrong results when using multi// instance on a receive task The parent execution must be set to false, so it wouldn't show up in// the execution query when using .activityId(something). Do not we cannot nullify the// activityId (that would have been a better solution), as it would break boundary event behavior.if (!concurrentExecutions.isEmpty()) {multiInstanceRootExecution.setActive(false);}return nrOfInstances;}

通过源码可以看出,并行多实例任务底层还是按顺序生成的,并不是并行生成。

以下是 该类的结构图:

 可以看出该类是继承 FlowNodeActivityBehavior 类,以下是FlowNodeActivityBehavior的源码:

/* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at* *      http://www.apache.org/licenses/LICENSE-2.0* * Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
package org.flowable.engine.impl.bpmn.behavior;import org.flowable.bpmn.model.FlowNode;
import org.flowable.common.engine.api.FlowableException;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.impl.delegate.TriggerableActivityBehavior;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;/*** Superclass for all 'connectable' BPMN 2.0 process elements: tasks, gateways and events. This means that any subclass can be the source or target of a sequenceflow.* * Corresponds with the notion of the 'flownode' in BPMN 2.0.* * @author Joram Barrez*/
public abstract class FlowNodeActivityBehavior implements TriggerableActivityBehavior {private static final long serialVersionUID = 1L;protected BpmnActivityBehavior bpmnActivityBehavior = new BpmnActivityBehavior();/*** Default behaviour: just leave the activity with no extra functionality.*/@Overridepublic void execute(DelegateExecution execution) {leave(execution);}/*** Default way of leaving a BPMN 2.0 activity: evaluate the conditions on the outgoing sequence flow and take those that evaluate to true.*/public void leave(DelegateExecution execution) {bpmnActivityBehavior.performDefaultOutgoingBehavior((ExecutionEntity) execution);}public void leaveIgnoreConditions(DelegateExecution execution) {bpmnActivityBehavior.performIgnoreConditionsOutgoingBehavior((ExecutionEntity) execution);}@Overridepublic void trigger(DelegateExecution execution, String signalName, Object signalData) {// concrete activity behaviours that do accept signals should override this method;throw new FlowableException("this activity isn't waiting for a trigger");}protected String parseActivityType(FlowNode flowNode) {String elementType = flowNode.getClass().getSimpleName();elementType = elementType.substring(0, 1).toLowerCase() + elementType.substring(1);return elementType;}
}
FlowNodeActivityBehavior是流节点活动行为类,是所有“可连接”BPMN 2.0流程元素的超类:任务、网关和事件。这意味着任何子类都可以是sequenceflow的源或目标。与BPMN 2.0中的“流节点”(flownode)概念相对应。

FlowNodeActivityBehavior 的职责和作用

  1. 定义流程节点的行为:

    • FlowNodeActivityBehavior接口定义了处理流程节点的标准行为,例如开始、结束、分支等。
    • 实现这个接口的类负责处理特定类型的流程节点,比如服务任务、用户任务、网关等。
  2. 执行流程节点的逻辑:

    • 当流程执行器到达某个流程节点时,它会查找该节点的行为实现,并调用相应的方法来执行节点的逻辑。
    • 这些方法包括但不限于executeleave等,它们负责处理节点的进入、执行和离开等操作。
  3. 支持不同类型的流程节点:

    • 不同类型的流程节点会有不同的行为实现,例如用户任务和服务任务会有各自的实现类。
    • 例如,用户任务的行为实现类可能需要处理用户界面交互,而服务任务的行为实现类则可能需要调用外部系统的服务。

关键方法

FlowNodeActivityBehavior接口包含以下方法:

  • execute(Execution execution): 负责执行流程节点的主要逻辑。当流程执行器到达该节点时,会调用此方法。
  • leave(Execution execution): 负责在流程节点执行完成后离开该节点的操作。这通常涉及到更新执行状态、触发后续路径等。

相关文章:

flowable源码解读——并行多实例节点任务是否是顺序生成

最近在项目开发中需要在多实例开始监听里修改一个全局的计数变量&#xff0c;不太确定并行多实例任务在底层引擎是顺序生成还是并行生成的&#xff0c;如果是顺序生成的则不影响&#xff0c;如果是并行生成 则修改一个全局的计数变量就会出现数据错误问题&#xff0c;查阅了flo…...

【机器学习】AGI的基本概念、技术挑战和应用前景

引言 AGI是指机器能够完成人类能够完成的任何智力任务的能力 文章目录 引言一、什么是AGI1.1 AGI&#xff0c;Artificial General Intelligence&#xff08;通用人工智能&#xff09;1.2 AGI的定义和标准1.3 AGI的发展 二、AGI的技术挑战2.1 理解人类智能2.2 认知复杂性2.3 自主…...

flink 使用RocksDB作为状态后端

RocksDB flink在生产环境中常用RocksDB作为状态后端 1、subtask在taskmanager中作为一个线程运行&#xff0c;如果设置了RocksDB状态后端&#xff0c;RocksDB也会启动一个独立的线程&#xff0c;供subtask来使用。 2、RocksDB是一个kv数据库&#xff0c;因此只能存储flink的键…...

【运维高级内容--MySQL】

目录 一、mysql安装 二、MySQL主从复制 一、mysql安装 yum install cmake gcc-c openssl-devel ncurses-devel.x86_64 rpcgen.x86_64 #安装依赖性 #在root路径下下载mysql-boost-5.7.44、libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm安装包 yum install libtirpc-devel…...

【仿真与实物设计】基于51单片机设计的打地鼠游戏机——程序源码原理图proteus仿真图PCB设计文档演示视频元件清单等(文末工程资料下载)

基于51单片机设计的打地鼠游戏机 演示视频&#xff1a; 基于51单片机设计的打地鼠游戏机 功能描述&#xff1a;使用 51单片机为核心制作一个打地鼠游戏机。按下启动开关&#xff0c;8盏LED流水点亮并闪烁2次&#xff0c;随即开始播放游戏音乐&#xff0c;直到开始选择模式。选…...

iPhone设备使用技巧:忘记密码的情况下如何解除iOS 18/17屏幕时间

我们给了儿子一部新手机。在尝试擦除旧手机上的所有内容并恢复出厂设置时&#xff0c;它要求提供 4 位屏幕时间密码。我已经尝试了我们会使用的所有可能性&#xff0c;但无法弄清楚。我们如何绕过这个问题或将手机恢复出厂设置以便我们可以出售它&#xff1f; Apple 社区 对于…...

内网渗透的风行者—Yasso

Yasso &#xff1a; Yasso&#xff0c;让内网渗透变得简单而高效。- 精选真开源&#xff0c;释放新价值。 概览 Yasso是由sairson精心打造的内网渗透辅助工具集&#xff0c;它为网络安全专家和渗透测试人员提供了一个功能强大的工作平台。在面对错综复杂的网络环境时&#xff…...

Android13 app后台无法启动Abort background activity starts from

总纲 android13 rom 开发总纲说明 目录 1.前言 2.log分析 3.代码查找分析 4.修改方法 5.编译测试 6彩蛋 1.前言 Android13 用户app后台无法启动,提示Abort background activity starts from 10111 2.log分析 08-07 21:37:36.703: W/ActivityTaskManager(440): Back…...

Day45 | 99.岛屿数量 深搜 广搜 100.岛屿的最大面积

语言 Java 99.岛屿数量 深搜 广搜 99. 岛屿数量 题目 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可…...

css之grid布局(网格布局)

简述&#xff1a; 网格布局顾名思义就是将元素呈现为网状的整齐布局 简单使用&#xff1a; <div><div class"test"><div class"item">1</div><div class"item">2</div><div class"item">…...

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件&#xff0c;不仅擅长构建交互式界面&#xff0c;更在数据可视化方面展现出了非凡的创意与实用性。今天&#xff0c;就让我们一起探索Axure设计的几款精美数据可视化大屏模板&#xff0c;感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…...

【与C++的邂逅】--- 类和对象(中)

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客我们将学习类和对象中&#xff0c;认识类的六个默认成员函数以及实现日期类。下图为本节思维导图。 &#x1f3e0; 类的6个默认成员函…...

[数据集][目标检测]瞳孔虹膜检测数据集VOC+YOLO格式8768张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8768 标注数量(xml文件个数)&#xff1a;8768 标注数量(txt文件个数)&#xff1a;8768 标注…...

Day42 | 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II

语言 Java 739. 每日温度 每日温度 题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该…...

运维大规模K8S集群注意事项

序言 闲来无事&#xff0c;一片混沌&#xff0c;想不清思不断&#xff0c;改变好像来自于各个方面&#xff0c;有的时候是内部的冲突&#xff0c;有的时候是外部的竞争&#xff0c;然而&#xff0c;大部分情况下&#xff0c;一旦错过&#xff0c;就已经没得选了。 尴尬的处境&a…...

供应链系统源码的关键技术是什么?

供应链管理是企业运营中的重要环节&#xff0c;而高效的供应链系统能够大幅提升企业的竞争力。在数字化转型的过程中&#xff0c;越来越多的企业选择使用开源供应链系统源码来定制开发适合自身需求的解决方案。那么&#xff0c;供应链系统源码的关键技术有哪些&#xff1f;本文…...

git 修改远程仓库的 URL

git remote set-url origin 修改远程仓库的 URL。 old:ssh://wangzhijun192.168.10.48:29418/kapok new:http://wangzhijun172.31.178.243:90/kapok git remote set-url origin ssh://wangzhijun172.31.178.243:29418/kapok old:https://120.79.152.225/wuzeyuan/flymap_app n…...

使用图数据库 Neo4j 处理对象之间的关系

使用 Neo4j 图数据库来处理明星之间的关系涉及以下主要步骤&#xff1a;数据建模、数据导入、查询和关系修改。下面是详细的操作步骤&#xff1a; 1. 安装 Neo4j 下载和安装: 从 Neo4j 官方网站 下载 Neo4j Community Edition 或者 Enterprise Edition&#xff0c;安装并启动…...

使用C#的异步和依赖注入实现网络数据存储

详细解释 依赖注入&#xff08;Dependency Injection&#xff09;: ConfigureServices 方法配置了服务的依赖注入。IDataProcessor 接口与 DataProcessor 类绑定&#xff0c;IDbConnectionFactory 接口与 DbConnectionFactory 类绑定。这样在程序运行时&#xff0c;依赖注入容器…...

tomcat日志文件切割

文章目录 引言I 使用用crontab工具,定时执行任务II 通过Linux系统自带的切割工具logrotate来进行切割logrotate 简介用法结合crontab进行自定义的定时轮转操作III 基于其他日志框架进行分隔引言 tomcat 的 catalina.out 文件不会进行日志切割,当这个文件大于2G 时,会影响to…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起&#xff0c;为了跨网段推流&#xff0c;千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

C++ Saucer 编写Windows桌面应用

文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架&#xff0c;开发Windows桌面应用&#xff0c;把一个html页面作为GUI设计放到Saucer里&#xff0c;隐藏掉运行时弹…...