Compileflow工作流引擎使用讲解

news2025/2/25 13:03:21

文章目录

  • 1 Compileflow
    • 1.1 简介
    • 1.2 特点
    • 1.3 Compileflow插件下载
    • 1.4 main方法调用
      • 1.4.1 pom.xml
      • 1.4.2 新建bpm文件
      • 1.4.3 各个节点绑定方法
      • 1.4.4 测试方法
    • 1.5 bpm各个标签说明
      • 1.5.1 BPM根节点
      • 1.5.2 全局变量
      • 1.5.3 开始节点: start
      • 1.5.4 结束节点: end
      • 1.5.5 自动节点: autoTask--流程节点
      • 1.5.6 判断节点: decision
      • 1.5.7 脚本节点: scriptTask
      • 1.5.8 循环节点

1 Compileflow

1.1 简介

compileflow 是一个非常轻量、高性能、可集成、可扩展的流程引擎。
compileflow Process 引擎是淘宝工作流 TBBPM 引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成 java 代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。

compileflow 能让开发人员通过流程编辑器设计自己的业务流程,将复杂的业务逻辑可视化,为业务设计人员与开发工程师架起了一座桥梁。

1.2 特点

功能列表:

  • 高性能:通过将流程文件转换生成 java 代码编译执行,简洁高效。
  • 丰富的应用场景:在阿里巴巴中台解决方案中广泛使用,支撑了导购、交易、履约、资金等多个业务场景。
  • 可集成:轻量、简洁的设计使得可以极其方便地集成到各个解决方案和业务场景中。
  • 完善的插件支持:流程设计目前有 IntelliJ IDEA、Eclipse 插件支持,可以在流程设计中实时动态生成 java 代码并预览,所见即所得。
  • 支持流程设计图导出 svg 文件和单元测试代码。
  • 支持基于 Java 反射和 Spring 容器的代码触发

1.3 Compileflow插件下载

由于Idea插件市场没有,需要自己手动下载导入,根据各个版本自动下载
https://gitcode.com/mirrors/compileflow/compileflow-designer-upgrade/overview

使用本地安装的方式安装,注意安装整个zip不用手动解压
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重启IntelliJ IDEA就会生效

1.4 main方法调用

1.4.1 pom.xml

compileflow jar 依赖

<dependency>
    <groupId>com.alibaba.compileflow</groupId>
    <artifactId>compileflow</artifactId>
    <version>1.0.0</version>
</dependency>

1.4.2 新建bpm文件

在这里插入图片描述
示例,新建一个account.bpm文件,选择ProcessFlow,进行可视化编辑
在这里插入图片描述
先创建开始和结束后,添加判断节点:
在这里插入图片描述
如图,此处是验证用户名节点,以此类推创建验证密码和验证验证码节点
在这里插入图片描述
其中的连接节点是条件是result==true的通过,不然不通过
在这里插入图片描述

在这里插入图片描述
最后,双击编辑页空白处,配置全局参数
在这里插入图片描述
在这里插入图片描述

1.4.3 各个节点绑定方法

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account {
    private String password;
    private String name;
    private String verificationCode;

}
public class AccountVerify {

    public boolean verifyName(Account account) {
        if (StringUtils.isNotEmpty(account.getName())) {
            System.out.println("name认证通过");
            return true;
        }
        System.out.println("name认证不通过");
        return false;
    }

    public boolean verifyPassword(Account account) {
        if (StringUtils.isNotEmpty(account.getPassword())) {
            System.out.println("密码认证通过");
            return true;
        }
        System.out.println("密码认证不通过");
        return false;
    }

    public boolean verifyVerificationCode(Account account) {
        if (StringUtils.isNotEmpty(account.getVerificationCode())) {
            System.out.println("验证码认证通过");
            return true;
        }
        System.out.println("验证码认证不通过");
        return false;
    }
}

1.4.4 测试方法

import cn.flow.entity.Account;
import com.alibaba.compileflow.engine.ProcessEngine;
import com.alibaba.compileflow.engine.ProcessEngineFactory;

import java.util.HashMap;
import java.util.Map;
public class CompileFlowTest {
    public static void main(String[] args) {
        Account account = new Account();
        account.setName("haha");
        account.setPassword("pwd");
        account.setVerificationCode("1111");
        //找到bpm文件的位置 如果是在包中,bpm/account.bpm 则为 bpm.account
        String code = "account";

        //设置上下文
        Map<String, Object> context = new HashMap<>();
        context.put("account", account);

        try {
            //执行流程
            ProcessEngine processEngine = ProcessEngineFactory.getProcessEngine();
            Map<String, Object> result = processEngine.execute(code, context);

            // 处理其他业务逻辑
            if (Boolean.parseBoolean(result.get("result").toString())) {
                System.out.println("认证通过");
            } else {
                System.out.println("认证不通过");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

1.5 bpm各个标签说明

1.5.1 BPM根节点

<bpm code="bpm.testStudy" name="testStudy" type="process" description="This is test demo."></bpm>
  • code:该属性最重要,当引擎start执行流程时,会要求传入code参数,这个参数就是流程文件中的code字段,code约定用表示文件存放目录层级
  • type:目前固定写死process,后续可扩展支持多种类型流程.
  • name:按自己工程需要命名
  • description:按自己工程需要命名.

1.5.2 全局变量

<var name="account" description="入参" dataType="cn.flow.entity.Account" inOutType="param"/>
<var name="result" description="出参" dataType="java.lang.Boolean" inOutType="return"/>

参数用var节点表示,直接在根节点bpm下的就叫全局参

  • inOutType属性:表示参数类型,值有3种: param、inner、return
    • param:表示对应引擎start的入参,当我们start流程时,除了需要设置code,还需要设置contex,它是一个MAP,其中key就需要映射成上面var节点的name属性
    • inner:表示内部运行时各个节点执行后的中间变量.
    • return:表示返回结果变量,流程执行完成后,我们拿到了一个result结果,是个MAP,其中指定了return类型的var节点,我们可以通过name作为key从result拿到值.
  • dataType:参数类型,支持java类型写法例如上面的: java.lang.Boolean
  • name:变量名称
  • description:变量描述

1.5.3 开始节点: start

<start id="1" name="开始" tag="223" g="105,17,30,30">

流程的开始节点用start表示.

  • transition:表示指向下一个节点.
  • to:就是下一个节点的id.
  • id:节点的唯一标志,请保持唯一
  • tag:节点的附加数据
  • name:节点名称会在流程图上显示
  • g:布局

1.5.4 结束节点: end

<end id="11" name="结束" tag="已经结束" g="101,549,30,30">
  • id:节点的唯一标志,请保持唯一
  • tag:节点的附加数据
  • name:节点名称会在流程图上显示
  • g:布局

1.5.5 自动节点: autoTask–流程节点

<autoTask id="1705217851098" name="自动节点" tag="123" g="405,190,90,50">
    <action type="java">
      <actionHandle clazz="cn.flow.verify.AccountVerify" method="verifyVerificationCode">
        <var name="account" dataType="cn.flow.entity.Account" contextVarName="account" inOutType="param"/>
        <var name="boolean" dataType="java.lang.Boolean" contextVarName="result" inOutType="return"/>
      </actionHandle>
    </action>
  </autoTask>

自动节点用autoTask表示是最常见的,主要执行一段逻辑.目前支持springBean的配置和普通javaBean的配置.其中action就是要配置的动作.下面actionHandle配置该动作出入参.最终这个节点会被编译成javaCode如下:

1.5.6 判断节点: decision

<decision id="1705213493244" name="验证验证码" g="250,310,90,50">
    <transition to="11" name="通过验证码验证" expression="result==true"/>
    <transition to="11" name="没通过验证码验证" expression="result==false"/>
    <action type="java">
      <actionHandle clazz="cn.flow.verify.AccountVerify" method="verifyVerificationCode">
        <var name="account" dataType="cn.flow.entity.Account" contextVarName="account" inOutType="param"/>
        <var name="boolean" dataType="java.lang.Boolean" contextVarName="result" inOutType="return"/>
      </actionHandle>
    </action>
 </decision>

判断节点用decision表示,主要执行一段逻辑,然后根据执行后的逻辑值进行表达式判断后,再走不同的分支

1.5.7 脚本节点: scriptTask

<scriptTask id="9" name="成功" g="132,189,88,48">       

<var name="locationId" description="地址id" dataType="java.lang.Integer" contextVarName="locationId" inOutType="param">

脚本节点和自动节点差不多含义,就是执行一段逻辑,只是自动节点可以执行一个springBean或者一个javaBean,而脚本节点指定的是一个表达式,目前支持QL表示环境执行,ql 表达式是一种类似于 SQL 的查询语言,用于对数据进行过滤、排序、聚合等操作。它可以在脚本节点中使用,以便在工作流程执行期间对数据进行处理。

1.5.8 循环节点

<loopProcess id="13" name="循环节点" collectionVarName="pList" variableName="p" indexVarName="i" variableClass="java.lang.String" startNodeId="13-1" endNodeId="13-1" g="20,75,198,190">

<transition to="8" g=":-15,20"></transition>

<autoTask id="13-1" name="每人唱一首歌" g="50,80,88,48">

<action type="spring-bean">

<actionHandle bean="mockSpringBean" clazz="com.alibaba.compileflow.demo.mock.MockSpringBean" method="sing">

<var name="p1" dataType="java.lang.String" contextVarName="p" inOutType="param"></var> </actionHandle> </action>

</autoTask>

</loopProcess>

循环节点的作用是,包裹部分流程进行循环执行,collectionVarName表示要循环的列表变量,variableName表示每个循环的局部变量,indexVarName表示循环的次数

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

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

相关文章

关于Quartz远程调用服务方法失败如何解决,@Inner详细介绍

1.单独在要调用服务的controller写上相关方法&#xff08;Inner(value true)要走aop&#xff0c;会检测是否有内部调用标识&#xff09;具体见下述 2. 编写Feign远程调用的接口&#xff0c;注意加上RequestHeader(SecurityConstants.FROM) String from。因为inner(value true…

带你拿捏SpringBoot自动装配的核心技术?模块装配(@EnableXXX注解+@Import)+ 条件装配(@ConditionalXXX)

文章目录 Profile激活指定配置文件主配置文件中指定激活的profile命令行激活设置虚拟机参数激活 profile控制不到的地方 Spring原生的条件装配注解ConditionalConditional接口讲解案例讲解 Spring Boot封装的条件装配注解ConditionalXXX自己实现ConditionalOnBeanSpringBoot 源…

【目标检测】评价指标:mAP概念及其计算方法(yolo源码/pycocotools)

本篇文章首先介绍目标检测任务中的关键评价指标mAP的概念&#xff1b;然后介绍其在yolo源码和pycocotools工具中的实现方法&#xff1b;最后比较两种mAP的计算方法的不同之处。 目标检测中的评价指标&#xff1a; mAP概念及其计算方法(yolo源码/pycocotools) 混淆矩阵概念及其…

6.2 声音编辑工具GoldWave5简介(7)

6.2.5其它常用功能 1&#xff0e;高低通 把录制的语音和背景音乐融合在一起时&#xff0c;可能会出现背景音乐音量过大&#xff0c;语音音量过小的现象&#xff0c;这时可以选择“低通”将背景音乐的音量降低一些。 (1)选择【效果】|【波波器】|【低通/高通】命令&#xff0…

开箱即用的企业级前后端分离【.NET Core6.0 Api + Vue 2.x + RBAC】权限框架-Blog.Core

前言 今天要给大家推荐一个开箱即用的企业级前后端分离【.NET Core6.0 Api Vue 2.x RBAC】权限框架&#xff08;提高生产效率&#xff0c;快速开发就选它&#xff09;&#xff1a;Blog.Core。 推荐原因 Blog.Core通过详细的文章和视频讲解&#xff0c;将知识点各个击破&…

2024-1-12 关于SVPWM的理解疑问

直流母线电压利用率是指逆变电路&#xff08;电机控制器&#xff09;所能输出的交流电压基波最大幅值U1m和直流母线电压之比。 电压利用率 SVPWM算法理解&#xff08;二&#xff09;——关于非零基本矢量幅值和线电压幅值的解释 因此我们在实际应用中提供的直流侧电压Udc&…

ssm基于Web的课堂管理系统设计与实现论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

【Linux】 系统目录结构

进入到根目录 cd /ls目录名具体作用/存放系统系统相关的目录文件/boot放置linux系统内核文件和启动时用到的一些引导文件/home包含linux系统上各用户的主目录&#xff0c;子目录名称默认以该用户名命名/root系统管理员root的家目录/bin包含常用的命令文件&#xff08;如ls 等&a…

STM32 CAN学习(一)

STM32 CAN CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称&#xff0c;它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的&#xff0c;并最终成为国际标准&#xff08;ISO11519&#xff09;&#xff0c;是国际上应用最广泛的现场总线之一。CAN总线协…

Qat++,轻量级开源C++ Web框架

目录 一.简介 二.编译Oat 1.环境 2.编译/安装 三.试用 1.创建一个 CMake 项目 2.自定义客户端请求响应 3.将请求Router到服务器 4.用浏览器验证 一.简介 Oat是一个面向C的现代Web框架 官网地址&#xff1a;https://oatpp.io github地址&#xff1a;https://github.co…

JavaScript中alter、confrim、prompt的区别及使用

文章目录 一、alter1.什么是alert&#xff1f;2.alter的使用 二、confrim1.什么是confrim&#xff1f;2.confrim的使用 三、prompt1.什么是prompt&#xff1f;2.prompt的使用 四、总结alter、confrim、prompt的区别 一、alter 1.什么是alert&#xff1f; 在JavaScript中&…

ssm基于Vue的健身房会员管理系统+vue论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

强化学习应用(四):基于Q-learning算法的无人车配送路径规划(提供Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法&#xff0c;用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤&#xff1a; 1. 定义环境&#xff1a;确定问题的状态和动作空间&#xff0c;并…

1.5矩阵元素的引用

通过下标来引用矩阵的元素 A(3, 2)表示A矩阵第3行第2列的元素。 >> arr [1,2,3;4,5,6]; >> arr(4, 5) 10arr 1 2 3 0 04 5 6 0 00 0 0 0 00 0 0 0 10>> 如果引用元素超过矩阵的大小将自…

ssm基于spring和vue开发的web新闻流媒体平台论文

摘 要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这样的解决方法&#x…

隧道应用3-Cobalt Strike正反向连接多层内网

Cobalt Strike 正向连接多层内网&#xff1a; teamserver 不允许访问 B &#xff0c;但是服务器上A有权限&#xff08; A 与 B 在同一网段&#xff09;&#xff0c;若 A 服务上已经有了 cs 的后门&#xff0c;则可以通过 cs 的正向连接去连接 B &#xff0c;在 teamserver 通…

基于机器学习的高考志愿高校及专业分析系统

本项目在“基于 Python 的高考志愿高校及专业分析系统”基础上补充添加了机器学习算法对高考总问进行预测&#xff1b; 项目采用了网络爬虫技术&#xff0c;从指定的高考信息网站上抓取了各大高校的历年录取分数线数据。 通过精细的数据清洗过程&#xff0c;这些数据被存储于…

黑马程序员SpringBoot2-开发实用篇

视频连接&#xff1a;开发实用篇-67-手工启动热部署_哔哩哔哩_bilibili 热部署 手动启动热部署 热部署仅包含restart的过程。 自动启动热部署 按CtrlAltShift/打开下列界面。 禁用热部署 配置高级 ConfigurationProperties 宽松绑定/松散绑定 常用计量单位绑定 数据校验 设置…

阿里云优惠券介绍、种类、领取入口及使用教程

阿里云优惠券是阿里云提供的一种优惠活动&#xff0c;旨在帮助用户节省购买云服务产品的费用。本文将为大家详细介绍阿里云优惠券的相关信息&#xff0c;包括优惠券的介绍、种类、领取入口以及使用教程。 一、阿里云优惠券介绍 阿里云优惠券是阿里云提供给用户的一种优惠凭证&…

超强站群系统v9.0:最新蜘蛛池优化技术,一键安装,内容无缓存刷新,高效安全

安全、高效&#xff0c;化的优化利用php性能&#xff0c;使得运行流畅稳定 独创内容无缓存刷新不变&#xff0c;节省硬盘。防止搜索引擎识别蜘蛛池 蜘蛛池算法&#xff0c;轻松构建站点&#xff08;电影、资讯、图片、论坛等等&#xff09; 可以个性化每个网站的风格、内容、…