Compileflow工作流引擎使用讲解

文章目录

  • 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表示循环的次数

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

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

相关文章

B-TREE(B-树)

B-TREE B-tree 又叫平衡多路查找树。一棵 m 阶的 B-tree (m 叉树)的特性如下&#xff08;其中 ceil(x)是一个取上限的函数&#xff09;&#xff1a; 树中每个结点至多有 m 个孩子&#xff1b; 除根结点和叶子结点外&#xff0c;其它每个结点至少有有 ceil(m / 2)个孩子&#…

JVM实战(13)——JVM优化概述

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

每日一题——LeetCode1128.等价多米诺骨牌对的数量

先尝试暴力解法&#xff1a; var numEquivDominoPairs function(dominoes) {var count0for(let i0;i<dominoes.length-1;i){for(let ji1;j<dominoes.length;j){if((dominoes[i][0]dominoes[j][0] && dominoes[i][1]dominoes[j][1]) || (dominoes[i][0]dominoes…

Qt/QML编程学习之心得:小键盘keyboard(36)

小键盘对于qml应用是经常用到的,在qml里面,就如一个fileDialog也要自己画一样,小键盘keyboard也是要自己画的,对于相应的每个按键的clicked都要一一实现的。 这里有一个示例: 代码如下: import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Window 2.0 im…

Redis面试篇

redis面试题主要内容 面试官在面试时主要会问以下这些方面的问题 下面是一些问题示例&#xff1a; redis-使用场景 缓存 缓存穿透 介绍 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都会去查数…

2.1 常用计算机网络体系结构

2.1 常用计算机网络体系结构 2.1.1 OSI体系结构 1、为了使不同体系结构的计算机网络都能够互联&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;不久他们就提出了一个试图使各种计算机在世界范围内都能够互连成网的标准框架&#xff0c;也就是著名的…

Redis命令 - Lists命令组常用命令

先创建一个 key 叫做 mylist&#xff0c;mylist存一个list。 list数据类型底层是一个链表。先进后出&#xff0c;后进先出。 命令中的L&#xff08;Left&#xff09;、R&#xff08;Right&#xff09;代表链表的头部L&#xff08;下标0的位置&#xff09;和尾部R&#xff08;…

mysql5.7之从入门到放弃

系列文章目录 第一章 MySQL5.7之从入门到放弃 第二章 MySQL从入门到放弃之数据库体系结构与管理 第三章 MySQL基础应用之DDL、DCL、DML、DQL 文章目录 系列文章目录前言一、Mysql的介绍和安装&#xff1f;1、什么是数据&#xff1f;2、什么是数据库管理系统&#xff08;DBMS&a…

基于深度学习的老照片修复系统

技术栈 深度学习 pytorch tensorflow python 卷积神经 神经网络 照片修复 vue 老照片修复 扫描褪色 残损照片或胶片 调整暗调/高光以改善面效果 修正曝光斑痕 背景&#xff1a; 随着时间的流逝&#xff0c;许多老照片可能会褪色、损坏或曝光不当。这些老照片记录了宝贵的回忆…

如何在Windows 11的桌面中添加此电脑图标,这里提供四种方法

将“此电脑”图标添加到Windows 11桌面,使文件更容易访问。虽然Window的11酷设计从一开始就没有包含这个图标,但没必要担心。取回它很容易。你可以通过“设置”菜单、快捷方式或使用“控制面板”再次返回。有几种方法可以恢复此图标。 在这篇文章中,我们将探讨不同的方法,…

Windows下使用clion调试LevelDB与rocksdb

目录 关于leveldb下载leveldb源码增加测试文件更新cmake文件运行 关于RocksDB下载RocksDB代码修改CMakelist.txt运行 参考资料&#xff1a; 关于leveldb 下载leveldb源码 链接: leveldbGit地址 增加测试文件 使用clion打开项目&#xff0c;在根目录下新建一个app目录&#…

超详细的嵌入式cJSON使用注意事项,持续补充中......

文章目录 一、堆内存不足1.1 问题描述1.2 解决办法 二、内存泄露2.1 忘记Delete2.2 忘记Free2.3 串口数据接收缺少部分字符导致的内存泄露(自己的问题)问题分析 2.4 内存泄露在Cortex-M3内核会发生什么&#xff1f; cJSON开源库地址&#xff1a; cJSON 一、堆内存不足 1.1 问…

第十二讲 单片机驱动彩色液晶屏 如何打包bin档

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

Python-- if...else

在 Python 中&#xff0c;if 语句是用来进行条件判断的基本结构。它允许您根据一个或多个条件的真假来执行不同的代码块。Python 的 if 语句的基本语法如下&#xff1a; if condition:# do something elif another_condition:# do something else else:# do something if none…

【Linux】线程池实现

&#x1f4d7;线程池实现&#xff08;单例模式&#xff09; 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节&#x1f538;类成员函数参数列表中隐含的this指针&#x1f538;单例模式&#x1f538;一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是…

C#,求最长回文字符串的马拉车(Manacher)算法的源代码

一、回文字符串&#xff08;Palindromic String&#xff09; 回文字符串&#xff08;Palindromic String&#xff09;是指前、后向读起来完全相同的字符串。 回文字符串除了答题似乎没有什么用处 :P 二、求解思路 求解字符串的回文子串的基本思路&#xff1a; 1、遍历每个位…

C# 图解教程 第5版 —— 第25章 反射和特性

文章目录 25.1 元数据和反射25.2 Type 类25.3 获取 Type 对象25.4 什么是特性25.5 应用特性25.6 预定义的保留特性25.6.1 Obsolete 特性25.6.2 Conditional 特性25.6.3 调用者信息特性25.6.4 DebuggerStepThrough 特性25.6.5 其他预定义特性 25.7 关于应用特性的更多内容25.7.1…

springboot怎样设置全局的traceId(包括MQ)

一、Controller打印TraceId 1、拦截所有的controller&#xff0c;输入输出将traceId放入MDC中&#xff1a; package com.perkins.ebicycle.mobile.trace;import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors;import…

深思熟虑可能性模型介绍与使用

深思熟虑可能性模型介绍与使用 如何联系我 作者&#xff1a;鲁伟林 邮箱&#xff1a;thinking_fioa163.com或vlinyes163.com 版权声明&#xff1a;文章和记录为个人所有&#xff0c;如果转载或个人学习&#xff0c;需注明出处&#xff0c;不得用于商业盈利行为。 背景 20…

操作系统详解(5.1)——信号(Signal)的相关题目

系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 文章目录 题目第一问第二问第三问 题目…