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

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

    • v2.10.X
    • v2.9.X
    • v2.8.X
    • v2.7.X
    • v2.6.X
  • 升级指南

    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
  • 常见问题
  • 专题解释

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

    • TLog-轻量级的分布式日志追踪神器 (opens new window)
    • ERD ONLINE-开箱即用的数据库建模、产品版本管理软件 (opens new window)
    • Forest-更轻量、更简单实用的HTTP客户端框架 (opens new window)

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

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

    • v2.10.X
    • v2.9.X
    • v2.8.X
    • v2.7.X
    • v2.6.X
  • 升级指南

    • 升级到2.9.3说明
    • 升级到2.9.X说明
    • 升级到2.8.X说明
    • 升级到2.7.X说明
  • 常见问题
  • 专题解释

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

    • TLog-轻量级的分布式日志追踪神器 (opens new window)
    • ERD ONLINE-开箱即用的数据库建模、产品版本管理软件 (opens new window)
    • Forest-更轻量、更简单实用的HTTP客户端框架 (opens new window)
  • 🍤LiteFlow简介
  • 🍓项目特性
  • 🧁环境支持

    • ☕️JDK支持度
    • 🌿Springboot支持度
    • 🌱Spring的支持度
  • 🍟快速开始(Hello world)

    • 🍄说明
    • 🌿Springboot场景安装运行

      • 🧬依赖
      • ⚙️配置
      • 🛫执行
    • 🌱Spring场景安装运行

      • 🧬依赖
      • ⚙️配置
      • 🛫执行
    • 🌵其他场景安装运行

      • 🍄说明
      • 🧬依赖
      • ⚙️配置
      • 🛫执行
  • 🍢配置项

    • 🍄说明
    • 🌿Springboot下的配置项
    • 🌱Spring下的配置项
    • 🌵其他场景代码设置配置项
  • 🗂规则文件

    • 📔规则文件格式
    • 📕本地规则文件配置
    • 📗ZK规则文件配置源
    • 📘SQL数据库配置源
    • 📋Nacos配置源
    • 🗄Etcd配置源
    • 📜Apollo配置源
    • 📑Redis配置源

      • 配置说明
      • 轮询模式配置
      • 订阅模式配置
    • 📙自定义配置源
  • 🔗常规组件

    • 📎普通组件
    • ✂️选择组件
    • 📌条件组件
    • 🧬次数循环组件
    • ⛓条件循环组件
    • ⌛️迭代循环组件
    • 🧿退出循环组件
  • 🧩EL规则的写法

    • 🍄说明
    • 🌴串行编排
    • 🎋并行编排
    • 🌾选择编排
    • 🌵条件编排
    • 🌳循环编排
    • 🎃捕获异常表达式
    • 🍄与或非表达式
    • 🍁使用子流程
    • 🍂使用子变量
    • 💐复杂编排例子
    • 🌻关于分号
    • 🌰关于注释
    • 🐚组件名包装
    • 🔆验证规则
  • 🌮数据上下文

    • 🍄说明
    • 🌯数据上下文的定义和使用
    • 🪶用初始化好的上下文传入
  • 🛩执行器

    • 🍄说明
    • 🎡执行方法
    • 🎢流程入参
    • 🎈LiteflowResponse对象
  • 🍋脚本组件

    • 🌭脚本语言介绍
    • 🍫脚本语言种类

      • 🥏Groovy脚本引擎
      • 🧀Javascript脚本引擎
      • ☕️Java脚本引擎
      • 🥞QLExpress脚本引擎
      • 🍧Python脚本引擎
      • 🍝Lua脚本引擎
      • 🥐Aviator脚本引擎
    • 🍣脚本与Java进行交互
    • 🍱多脚本语言混合共存
    • 🌯文件脚本的定义
    • 🍘动态刷新脚本
  • 🍇声明式组件

    • 🥭什么叫声明式组件
    • 🧅类级别式声明
    • 🥥方法级别式声明
  • 🎲用代码动态构造规则

    • 🍄说明
    • 🎯如何构造
  • 🎨高级特性

    • 🍒前置和后置组件
    • 🍌本地规则文件监听
    • 🥠替补组件
    • 🍉组件参数
    • 🍑组件别名
    • 🍍组件标签
    • 🥝组件事件回调
    • 🐋组件回滚
    • 🥑隐式子流程
    • 🍕私有投递
    • 🍣组件重试
    • 🥦异步循环模式
    • ⏱️超时控制
    • 🍖平滑热刷新
      • 自动刷新的场景
      • 主动调用代码刷新
      • 单独刷新某一个规则
    • 🍪组件切面
    • 🍡步骤信息
    • 🧊异常
    • 🧇打印信息详解
    • 🧁自定义请求Id
    • 🌭不同格式规则加载
    • 🥗异步线程池自定义
    • 🍿自定义组件执行器
    • 🍥简单监控
    • 🧉XML的DTD
  • ⛱测试用例以及示例

    • 🪁测试用例
    • 🪀DEMO案例
  • 🪂性能表现
  • v2.11.X文档
  • 🎨高级特性
铂赛东
2022-07-03
目录

🍖平滑热刷新

LiteFlow支持了优雅平滑热刷新的特性。

即你可以在不重启服务的情况下,进行规则的重载。并且在高并发下刷新的时候,正在执行流程的线程是完全平滑的,不会因为刷新的过程而出现中断的现象。

在刷新时,正在执行的流程还是走的旧的流程,刷新好。后续request会自动切换到新的流程。


# 自动刷新的场景

如果你使用LiteFlow原生支持的zookeeper,etcd,nacos,apollo等插件(关于如何集成插件,请参考规则文件这一大章节),不需要你做任何事,只要规则更改之后,会自动热平滑刷新。


如果你是基于本地磁盘规则文件的,并且开启了自动监听设置,那么更改流程后也会自动平滑刷新。关于如何开启自动监听,请参考本地规则文件监听这一章。

# 主动调用代码刷新

如果你使用了数据库作为规则文件的存储方式,或是你自己实现了自定义配置源,那么LiteFlow还提供了一种基于代码刷新的方式。


你可以在spring容器中拿到FlowExecutor对象后,调用以下接口:

flowExecutor.reloadRule();

这个方法会按照启动时的方式去拉取你最新的流程配置信息,进行平滑热刷新。


这样调用有以下2点注意事项:

提示

1.这样刷新是全量刷新,不过各位同学不用担心其性能,经测试,LiteFlow框架一秒可以刷新1000条规则左右,这都是一些cpu级别的操作,如果你规则没有上大几千,几w条,那么推荐这种方式。

2.如果你的应用是多节点部署的,必须在每个节点上都要刷新,因为规则是存储在jvm内存里的。这就意味着,如果你把刷新规则做成一个rpc接口(诸如dubbo接口之类的),那么rpc接口只会调用到其中一个节点,也就是说,只会有一个节点的规则会刷新。

正确的做法是:利用mq发一个消息,让各个节点去监听到,进行刷新。


# 单独刷新某一个规则

如果你的规则比较多,成千上万条,又或者你就是不想全量刷新。希望单独刷新某个改动的规则。

那么LiteFlow也提供了相应的方式。

你可以利用以下api来进行刷新:

LiteFlowChainELBuilder.createChain().setChainName("chain2").setEL(
  "THEN(a, b, WHEN(c, d))"
).build();

提示

既然是指定刷新,那么必须你要获取到改动的EL内容,然后再利用动态代码构建重新build下就可以了,这种方式会自动替换缓存中已有的规则。这种方式不用在build之前销毁流程。

如果是多服务节点部署的情况下,还是要遵循每个节点要都刷新,上面已经说明具体建议的方式。这里不再赘述。

帮助我们改善此文档 (opens new window)
上次更新: 2023/08/04, 17:02:03
⏱️超时控制
🍪组件切面

← ⏱️超时控制 🍪组件切面→

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