LiteFlow LiteFlow
💒首页
  • v2.13.2(当前版本)
  • What's New

    • 🌈What' s New In LiteFlow v2.13.2?
  • 历史版本

    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 🌈2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
👑LF CLUB社区
  • 常见问题
  • 专题解释

    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)

广告采用随机轮播方式显示 ❤️成为赞助商
💒首页
  • v2.13.2(当前版本)
  • What's New

    • 🌈What' s New In LiteFlow v2.13.2?
  • 历史版本

    • v2.12.X
    • v2.11.X
    • v2.10.X
    • v2.9.X
    • v2.8.X
  • 升级指南

    • 🌈2.13.0升级指南
    • 2.12.4升级指南
    • 2.12.0升级指南
    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
👑LF CLUB社区
  • 常见问题
  • 专题解释

    • 如何理解上下文这个概念?
    • Slot是一个什么样的概念,在框架中起到什么样的作用?
💖赞助
🧩插件
🔥PPT
  • 项目介绍
  • 项目成员
  • 更新记录
  • 参与开发
👥加入群聊
🧤谁在使用
  • Gitee (opens new window)
  • GitCode (opens new window)
  • Github (opens new window)
  • 🍤LiteFlow简介
  • 🍓项目特性
  • 🍟快速开始(Hello world)

  • 🍢配置项

  • 🗂规则文件

  • 🔗常规组件

  • 🧩EL规则的写法

  • 🌮数据上下文

  • 🛩执行器

  • 🎲用代码动态构造规则

  • 🎨高级特性

    • 🍋脚本组件
      • 如何定义
      • 文件脚本的定义
      • 如何与java变量进行交互
      • 如何选择脚本框架
      • 脚本运行性能如何
      • 如何动态刷新脚本
    • 🍇声明式组件
    • 🍒前置和后置组件
    • 🥠替补组件
    • 🍑组件别名
    • 🍍组件标签
    • 🥝组件事件回调
    • 🥑隐式子流程
    • 🍕私有投递
    • 🍣组件重试
    • 🍖平滑热刷新
    • 🍪组件切面
    • 🍡步骤信息
    • 🧊异常
    • 🧇打印信息详解
    • 🧁自定义请求Id
    • 🌭不同格式规则加载
    • 🥗异步线程池自定义
    • 🍿自定义组件执行器
    • 🍥简单监控
  • ⛱测试用例以及示例

  • 🪂性能表现
  • v2.8.X文档
  • 🎨高级特性
铂赛东
2022-07-02
目录

🍋脚本组件

LiteFlow支持脚本节点的创建。支持热刷新脚本,支持QLExpress和Groovy两种脚本的编写。

关于这两种脚本语言的语法,可能提前大家要稍加熟悉,这里给出两个教程:

Groovy语法教程 (opens new window)

QLExpress语法教程 (opens new window)

# 如何定义

脚本节点定义是在规则文件中,你需要做如下定义(这里以xml文件格式举例):

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <nodes>
        <node id="s1" name="普通脚本" type="script">
            <![CDATA[
                a=3;
                b=2;
                defaultContext.setData("s1",a*b);
            ]]>
        </node>

        <node id="s2" name="选择脚本" type="switch_script">
            <![CDATA[
                count = defaultContext.getData("count");
                if(count > 100){
                    return "a";
                }else{
                    return "b";
                }
            ]]>
        </node>

        <node id="s3" name="条件脚本" type="if_script">
            <![CDATA[
                return false;
            ]]>
        </node>
    </nodes>

    <chain name="chain1">
        THEN(a, b, c, s1);
    </chain>

    <chain name="chain2">
        THEN(d, SWITCH(s2).to(a, b));
    </chain>

    <chain name="chain3">
        THEN(d, IF(s3, b, c));
    </chain>
</flow>

要注意的是,type分为三种:

script:普通脚本节点,脚本里无需返回。

switch_script:选择脚本节点,脚本里需要返回选择的节点Id。

if_script:条件脚本节点,脚本里需要返回true/false

你可以在示例的位置进行编写动态脚本来处理业务逻辑。

提示

这里示例是传入的上下文bean是默认的DefaultContext,如果是你自定义的上下文Bean,请调用相应的方法来设置和获取数据。

# 文件脚本的定义

LiteFlow从2.6.4开始支持了脚本文件的定义。你除了可以把脚本内容写在配置文件中,也可以写在文件中。如果大的脚本就推荐写在文件中。毕竟IDE对文件的语法高亮和代码提示做的也相对友好。编写脚本会更加方便。

要注意的是,目前LiteFlow仅支持classpath内的脚本文件,这里无法定义绝对路径。以后可能会支持。

你可以这样定义(这里以xml文件格式举例):

<?xml version="1.0" encoding="UTF-8"?>
<flow>
    <nodes>
        <node id="s1" name="普通脚本" type="script" file="xml-script-file/s1.groovy"/>
        <node id="s2" name="选择脚本" type="switch_script" file="xml-script-file/s2.groovy"/>
        <node id="s3" name="条件脚本" type="switch_script" file="xml-script-file/s3.groovy"/>
    </nodes>

    <chain name="chain1">
        THEN(a, b, c, s1)
    </chain>

    <chain name="chain2">
        THEN(d, IF(s3, b, c));
    </chain>
</flow>

# 如何与java变量进行交互

因为LiteFlow组件与组件之间的数据交互都在上下文中,所以在脚本语言中,你可以通过你定义数据上下文的className的驼峰形式来获取数据。

比如你的上下文类叫OrderContext,那么脚本中的就用orderContext这个关键字来获取数据或调用方法。

如果你是多上下文,同样的,你也可以在脚本中用多个上下文来获取数据或调用context内部的逻辑方法。

如果想获得流程初始参数,脚本内置了requestData关键字。

如果你的脚本在隐式流程中,想获取当前隐式流程的入参,则应该用subRequestData关键字。

普通脚本组件,脚本中无需返回值。只需要把结果设置到context即可(这和普通的java编写的组件是一致的)。

而条件脚本节点,则需要在脚本中返回条件路由到的节点ID,返回String类型(这也和java编写的选择组件是一致的)。

# 如何选择脚本框架

LiteFlow采用SPI机制进行选择脚本框架来动态编译你的脚本。

QLExpress脚本,你需要额外依赖:

<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>liteflow-script-qlexpress</artifactId>
    <version>2.8.5</version>
</dependency>

Groovy脚本,你需要额外依赖:

<dependency>
    <groupId>com.yomahub</groupId>
    <artifactId>liteflow-script-groovy</artifactId>
    <version>2.8.5</version>
</dependency>

你只需要依赖相应的脚本框架即可,SPI会动态选择你依赖的脚本框架进行编译解析你的脚本

# 脚本运行性能如何

LiteFlow对所有的脚本在启动时就进行了预编译,所以每次执行时无需编译的,运行性能和java不会差别太多。

# 如何动态刷新脚本

提供了编码形式的刷新,刷新后可以重新编译脚本

ScriptExecutorFactory.loadInstance().getScriptExecutor().load(nodeId, script);
帮助我们改善此文档 (opens new window)
上次更新: 2022/10/07, 00:22:18
🎯如何构造
🍇声明式组件

← 🎯如何构造 🍇声明式组件→

Theme by Vdoing | Copyright © 2020-2025 铂赛东 | MIT License
沪ICP备18012955号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式