Java动态脚本&规则引擎、计算/表达式引擎

这篇具有很好参考价值的文章主要介绍了Java动态脚本&规则引擎、计算/表达式引擎。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 常见的使用场景

在日常的Java项目中,我们免不了会遇到这样的需求:

  1. 动态地获取并运行自定义脚本文件,以实现特定的功能
  2. 对数据流执行用户自定义的数据有效性、公式计算、数据处理ETL(如数据截取、拼接)等不同业务逻辑
  3. 对用户输入的代码或脚本文件进行测试、运行,确保其语法正确、功能正常
  4. 处理需要灵活配置且不断变更的动态业务规则
  5. 代码的热更新、热修复

诸如此类的需求若采用硬编码实现,则迭代成本相当高,每次改动都需要进行开发、测试、部署。同时业务规则的频繁变更会导致代码的开发和维护成本大大提高。

2. Java动态脚本常见的实现方式

2.1 动态编译执行Java代码

2.2 通过Java脚本引擎执行不同类型的脚本

  • JavaScript

  • Groovy

  • Python

  • Lua

  • Ruby

  • Scala

以上脚本语言可根据项目实际需求、对不同脚本语言的掌握情况出发进行选择。

一般的需求可使用上述动态脚本实现,如果遇到业务规则更为复杂、规模更大、对功能和性能有更高要求的需求时,可考虑更为专业的规则引擎和计算/表达式引擎。

3 进阶:规则引擎&计算/表达式引擎

3.1 规则引擎

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

分离商业决策者的商业决策逻辑和应用开发者的技术决策

  • Drools (推荐)
  • OpenRules
  • EasyRules
  • OpenL Tablets
  • RuleBook
  • Esper

3.2 计算/表达式引擎

表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制

  • Fel
  • OGNL
  • Mvel
  • SpEL
  • JEXL
  • JSEL
  • Aviator
  • Expression4j
  • QLExpress

4. 使用动态脚本及上述引擎的优点

  • 逻辑和数据隔离
  • 可扩展性高
  • 可维护性高
  • 知识集中化
  • 提高业务灵活性
  • 业务透明度增强
  • 减少系统频繁迭代升级风险
  • 简化系统架构

5. 使用动态脚本常见的问题及解决方案

5.1. 安全问题

  • 提供常见的脚本文件供用户选择(系统提供的脚本文件更规范、更安全、性能更好)
  • 设置脚本编写规范及模板
  • 对用户提交的脚本做健康检查(如对Threadreflecttruncate等关键词进行检查,做提示确认或拒绝通过)
  • 对脚本进行版本管理,可对脚本做回滚处理
  • 对脚本设置审核机制
  • 可根据实际情况考虑是否对用户的脚本执行进行进程或线程隔离

5.2 OOM问题

Java执行动态脚本的过程往往会产生很多对象,而同一个脚本没必要每次执行时都去获取、编译、执行。可设计缓存策略,对编译后的脚本引擎进行缓存,既可避免频繁创建对象引起的内存溢出问题,又可提高性能文章来源地址https://www.toymoban.com/news/detail-426530.html


  • 如果这篇文章对你有用的话,点个再走呗!
  • 如有问题,欢迎留言评论!
  • 欢迎转载,烦请注明出处!

到了这里,关于Java动态脚本&规则引擎、计算/表达式引擎的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jexl3动态计算表达式

    Java Expression Language (JEXL) 是一个表达式语言引擎,可以用来在应用或者框架中使用。JEXL 受Velocity 和 JSP 标签库 1.1 (JSTL) 的影响而产生的。需要注意的是, JEXL 并不是 JSTL 中的表达式语言的实现。 实时引擎里 动态逻辑计算分离 计算逻辑经常变化或者可视化逻辑配置 引入JAR包

    2024年02月11日
    浏览(33)
  • 【java表达式引擎】四、高性能、轻量级的AviatorScript

    github:(https://github.com/killme2008/aviatorscript%60) 参考文档1:https://www.yuque.com/boyan-avfmj/aviatorscript 参考博客2:https://blog.csdn.net/ZhangQingmu/article/details/125087255 Aviator起源于2011年,由国内的开发者开源的,表达式引擎 表达式引擎当时国内开源的已经有 IKExpression,可惜是纯解释执行的,

    2024年02月10日
    浏览(41)
  • Java:正则表达式书写规则及相关案例:检验QQ号码,校验手机号码,邮箱格式,当前时间

    目标:体验一下使用正则表达式来校验数据格式的合法性。 需求:校验QQ号码是否正确,要求全部是数字,长度是(6-20)之间,不能以0开头

    2024年02月12日
    浏览(39)
  • Java中使用MapStruct实现对象转换时使用@Mapping的expression表达式实现自定义转换规则(多对一、获取当前Date)

    Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter: Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter_霸道流氓气质的博客-CSDN博客 上面介绍了mapstruct的简单使用,某些场景下需要自定义转换规则,比如记录时间字

    2024年02月14日
    浏览(28)
  • 计算数学表达式的程序(Java课程设计)

    团队名称 团队成 员介绍 任务分配 团队成员博客 XQ Warriors 徐维辉 负责计算器数据的算法操作,如平方数、加减乘除,显示历史计算记录 无 邱良厦(组长) 负责计算器的图形设计,把输入和结果显示在最上面的文本框 无 1)图形界面设计参考:Java Swing界面设计UI(全)_sw

    2024年01月21日
    浏览(32)
  • cron表达式语法规则及常见示例

    cron表达式最初是由Unix操作系统中的cron守护进程所使用的一种语法规则,用于设置定时任务。cron守护进程是Unix系统中的一个后台进程,用于周期性地执行指定的命令或脚本。它可以根据用户的需求,按照指定的时间间隔或时间点来执行任务,通常用于定时备份、清理日志、

    2024年02月09日
    浏览(39)
  • Java中Cron表达式的生成解析和计算的工具类

    本文介绍通过java生成cron表达式,解析表达式,计算表达式执行日期 需要引入quartz依赖 gitee地址:

    2024年02月07日
    浏览(32)
  • Java算法题 给一个字符串表达式,实现一个基本计算器,返回计算结果

    题目: 考点:栈 解题思路: 使用 2 个栈,一个 stack_nums 用来保存计算过程的操作数,一个 stack_symbol 用来保存运算符。 在HashMap中,指定加减优先级为1,乘除优先级为2 循环遍历字符串s, 操作符入栈: 若当前字符为\\\'+\\\', \\\'-\\\', \\\'*\\\', \\\'/\\\', \\\'(\\\' 时,压入运算符栈 stack_symbol, 操作数入

    2024年02月07日
    浏览(36)
  • 【尚硅谷】数据结构和算法——前缀、中缀、后缀表达式规则

    跟着B站的尚硅谷学习数据结构与算法,语言为java,目前是第七个代码内容——前缀、中缀、后缀表达式 课程传送门:尚硅谷——前缀、中缀、后缀表达式 1)前缀表达式又称波兰式, 前缀表达式 的运算符位于操作符之前。 2)举例说明:(3+4)*5-6 对应的前缀表达式就是 - *

    2024年02月03日
    浏览(45)
  • shell脚本正则表达式

    声明: 以下内容为个人笔记,内容不完全正确,请谨慎参考。 含义: 正则表达式使用的每个单独字符串来描述、匹配一些列符合语法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在Linux中,grep,sed,awk等文本处理工具都支

    2024年04月22日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包