规则引擎框架哪家强?这2个开源项目你应当知道,一个是Drools,另一个是...没想到吧(带私活源码)

 临时来活儿了,由于项目需要,预研了下规则引擎,领导让找个合适的规则引擎框架。

关于这一部分,之前确实没用过,遇事不决,先问百度。

百度上是这么介绍规则引擎的:

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

图片

应用案例

某电商平台促销活动:活动规则是根据⽤户购买订单的⾦额给⽤户送相应的积分:

  • 购买的越多送的积分越多

  • ⽤户可以使⽤积分来兑换相应的商品

我们这次活动的⼒度很⼤,肯定会吸引很多的⽤户参加,产品经理⼩王兴⾼采烈唾液横⻜的对⼩明讲到。

⽤户购买的⾦额和对应送多少积分的规则如下:

图片

⼩明⼀看,这需求果然简单呀,作为⼀个⼯作了两三年的程序员来讲,这不就是⼩case,半天搞定,送积分的⼼代码如下:

public void execute() throws Exception {
  List<Order> orderList = getInitData();
  for (int i=0; i<orderList.size(); i++){
    Order order = orderList.get(i);
    if (order.getAmout() <= 100){
      order.setScore(0);
      addScore(order);
    }else if(order.getAmout() > 100 && order.getAmout() <= 50{
      order.setScore(100);
      addScore(order);
    }else if(order.getAmout() > 500 && order.getAmout() <= 100{
      order.setScore(500);
      addScore(order);
    }else{
      order.setScore(1000);
      addScore(order);
    }
  }
}

上线运⾏了半天之后,财务部的⼩财突然监测到活动账户的⾦额⼤为减少,领导于是调整规则变成了这样:200元以下不给积分,1000元以 下给100积分…

活动效果不理想,和领导商议了⼀下,改为最初规则的1.5倍,及150元⼀下不给积分,750元以下给100积分…

图片

当规则在不断的变化过程中,⼩明想这样下去⾮得被他们弄死,必须要找找有什么技术可以将活动规则和代码解耦,不管规则如何变化,执⾏端不⽤动。

⼩明搜了半天还真有这样的东⻄,那就是规则引擎,那么规则引擎到底是什么东⻄呢?我们来看看。

优势

关于规则的优势,大家可能看到题目就已经猜出了大概,确实,正如猜测的这样。

  1. 可以提高效率,管理流程自动化,即使现代商业规则异常复杂。

  2. 市场要求业务规则经常变化,IT系统必须依据业务规则的变化快速、低成本的更新。

  3. 可快速、低成本的更新,业务人员应能直接管理IT系统中的规则,不需要程序开发人员参与。

常见的规则引擎有:easy-rules,Drools。

这两个都是解决常见的业务场景,比如电商会员服务的等级、积分、权益等模块中。

可以简单的了解:

  • easy-rules: 更轻量,在小的需求中使用

  • Drools:重量级选手,在金融、电信这类行业使用

图片

Drools 是什么?

图片

Drools 是为 Java 量身定制的基于 Charles Forgy 的 RETE 算法的规则引擎的实现。具有了 OO 接口的 RETE, 使得商业规则有了更自然的表达。

开发语言:Java

官网:www.drools.org

开源地址:https://github.com/kiegroup/drools

easy-rules

一句话简介:用于 Java 的简单、粗暴的规则引擎。

  • 轻量级库和易于学习的 API

  • 基于 POJO 的开发,带有注释编程模型

  • 用于定义业务规则并使用 Java 轻松应用它们的有用抽象

  • 从原始规则创建复合规则的能力

  • 使用表达式语言(如 MVEL、SpEL 和 JEXL)定义规则的能力

开源地址:https://github.com/j-easy/easy-rules

总结

简单对比两个规则引擎:

图片

更新情况:

easy-rules更新记录还在两年前,而Drools在本周内还在更新。在选用框架的时候,根据项目需要,看是简单业务还是复杂应用,选择合适的框架。

显然,Drools 目前表现的更活跃,功能更强大,同时意味着更高的学习维护成本。

写在最后(私活源码)

推荐一个后台管理系统。功能完整,代码结构清晰。值得推荐。

项目介绍

本项目系统是一款基于 SpringBoot + Bootstrap 的极速后台开发框架,可以用于所有的 Web 应用程序,易读易懂。RuoYi 支持集群,支持多数据源,支持分布式事务,拥有完善的权限管理。页面美观,完全响应式布局让你无论是电脑、平板还是手机等,都可随意使用。

图片

运行系统

  1. 首先我们将项目下载到本地,在 Gitee 下载页面下载解压到工作目录。

  2. 导入到 Eclipse,菜单 File -> Import,然后选择 Maven -> Existing Maven Projects,点击 Next > 按钮,选择工作目录,然后点击 Finish 按钮,即可成功导入。

  3. 创建数据库 ry 并导入数据脚本 ry_2021xxxx.sqlquartz.sql

  4. 打开项目运行 com.ruoyi.RuoYiApplication.java,出现如下图表示启动成功。

(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙
.-------. ____ __
| _ _ \ \ \ / /
| ( ' ) | \ _. / '
|(_ o _) / _( )_ .'
| (_,_).' __ ___(_ o _)'
| |\ \ | || |(_,_)'
| | \ `' /| `-' /
| | \ / \ /
''-' `'-' `-..-'

  1. 最后打开浏览器,输入:(http://localhost:80 (opens new window)) (默认账户/密码: admin/admin123 )若能正常登陆即说明搭建成功。

内置功能

本项目系统内置了多种后台管理的功能,包含系统管理、系统监控、系统工具。

系统管理
  • 用户管理:用户是系统操作者,该功能主要完成系统用户配置。

  • 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。

  • 菜单管理:配置系统菜单,操作权限,按钮权限标识等。

  • 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。

  • 岗位管理:配置系统用户所属担任职务。

  • 字典管理:对系统中经常使用的一些较为固定的数据进行维护。

  • 参数管理:对系统动态配置常用参数。

  • 通知公告:系统通知公告信息发布维护。

  • 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。

  • 登录日志:系统登录日志记录查询包含登录异常。

系统监控
  • 在线用户:当前系统中活跃用户状态监控。

  • 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。

  • 服务监控:监视当前系统 CPU、内存、磁盘、堆栈等相关信息。

  • 缓存监控:对系统的缓存查询,查看、清理等操作。

系统工具
  • 表单构建:拖动表单元素生成相应的HTML代码。

  • 代码生成:前后端代码的生成(java、html、xml、sql)支持 CRUD 下载 。

  • 系统接口:根据业务代码自动生成相关的 api 接口文档。

项目介绍

相信大家很多人都被公司领导要求过,说让大家来开发一个微信公众号的后台系统吧,大家是不是对微信这个各种繁琐的条件弄得非常头疼,今天给大家分享出一块源代码,大家以后如果有需要的,可以直接拿过来复制一下使用呦。

本项目系统是一个支持公众号管理系统,支持多公众号接入。本项目提供公众号菜单、自动回复、公众号素材、简易CMS、等管理功能,请注意本项目仅为管理后台界面,需配合后端程序wx-api一起使用。

项目简介

本项目系统是一个微信公众号管理系统,目前主要实现了如下功能:

● 公众号菜单管理
● 消息自动回复
● 素材管理
● 模板消息
● 粉丝管理

同时它提供了如下跟公众号无关的功能

● CMS文章管理
● 对象存储
● 权限管理(管理后台菜单权限、接口权限、角色权限)

技术选型

  • 核心框架:Spring Boot

  • 安全框架:Apache Shiro

  • 持久层框架:MyBatis-Plus

  • 公众号开发框架:WxJava

  • 后端脚手架:renren-fast

  • 页面交互:Vue2.x

  • UI框架:ElementUI

  • 管理后台界面模板:renren-fast-vue

  • 富文本编辑器:tinymce5

功能演示

           

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

源码获取方式:

​扫码关注本号,后台回复 私活

扫码关注本号,后台回复 私活

持续关注本号,分享更多私活源码

<think>嗯,用户想了解如何在Java中解析并执行Drools表达式。首先,我需要回忆一下Drools的相关知识。Drools一个业务规则管理系统,使用规则引擎来处理复杂的业务逻辑。它通常使用DRL(Drools Rule Language)来编写规则。但用户提到的是解析和执行Drools表达式,可能是指动态处理规则或条件判断的部分。 首先,我需要确定用户的具体需求。用户可能需要在运行时动态解析并执行某些条件表达式,类似于规则引擎中的条件判断。这时候,可能需要用到Drools提供的API,或者是其他表达式语言如MVEL,因为Drools内部使用MVEL作为表达式语言。 根据用户提供的引用内容,引用[1]和[2]提到了MVEL的使用,包括解释模式和编译模式。这可能与Drools相关,因为Drools确实集成了MVEL来处理表达式。所以,可能的解决方案是使用MVEL来解析和执行表达式,或者直接利用Drools的API来处理规则外,用户的问题中提到“解析并执行接收到的Drools表达式”,这可能指的是动态地处理规则条件,比如从数据库或配置文件中读取规则条件,然后由程序动态执行这些条件判断。这时候,需要了解Drools是否支持动态加载规则,或者是否需要将表达式提取出来单独处理。 可能的步骤包括:1. 创建Kie容器,加载DRL规则文件;2. 使用Drools的API插入事实对象并触发规则;3. 处理规则执行后的结果。此外,如果用户需要更灵活地处理表达式,可能需要直接使用MVEL,如引用[1]中的示例,通过MVEL.eval()来执行表达式。 还需要考虑用户是否有现有的Drools环境,或者是否需要从零开始配置。例如,是否需要添加Drools的依赖项,如何编写DRL文件,以及如何集成到Java应用中。 此外,用户可能关心性能问题,比如解释模式与编译模式的区别,如引用[2]所述。编译模式可能更适合需要多次执行的表达式,以提高性能,而解释模式适合一次性执行。 总结可能的回答方向:使用Drools的Kie API来加载和执行规则,或者直接使用MVEL处理表达式。需要分步骤说明如何配置依赖、编写规则、插入事实、触发规则,并给出代码示例。同时,比较两种方法的适用场景,以及可能的优化方法如预编译表达式。</think>### Java解析并执行Drools表达式的实现方法 #### 1. **Drools表达式执行原理** Drools规则引擎的核心是通过`DRL`(Drools Rule Language)定义规则,其条件部分通常使用`MVEL`或`Java语义`实现表达式解析[^1][^2]。执行过程分为两步: - **规则加载**:通过`KieContainer`加载规则文件; - **会话执行**:在`KieSession`中插入事实(Fact)并触发规则。 #### 2. **实现步骤** ##### 2.1 添加依赖 ```xml <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>7.73.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>7.73.0.Final</version> </dependency> ``` ##### 2.2 编写DRL规则文件 ```drl rule "Sample Rule" when $fact: FactObject(expression == true) // 条件表达式 then System.out.println("规则触发"); end ``` ##### 2.3 动态执行表达式 ```java KieServices kieServices = KieServices.Factory.get(); KieContainer kieContainer = kieServices.getKieClasspathContainer(); KieSession kieSession = kieContainer.newKieSession(); FactObject fact = new FactObject(); fact.setExpression(MVEL.eval("price > 100 && quantity < 10", context)); // 动态计算条件值[^1] kieSession.insert(fact); kieSession.fireAllRules(); kieSession.dispose(); ``` #### 3. **直接使用MVEL解析表达式** 若需脱离Drools框架独立执行表达式: ```java // 解释模式 Map<String, Object> context = new HashMap<>(); context.put("price", 150); context.put("quantity", 5); Boolean result = (Boolean) MVEL.eval("price > 100 && quantity < 10", context); // 输出:true[^1] // 编译模式(高频调用优化) Serializable compiledExpr = MVEL.compileExpression("price > 100 && quantity < 10"); Boolean result = (Boolean) MVEL.executeExpression(compiledExpr, context); // 性能提升30-50%[^2] ``` #### 4. **性能优化建议** - **预编译表达式**:对高频使用的表达式使用`MVEL.compileExpression()`; - **上下文复用**:避免重复创建`VariableResolverFactory`对象; - **规则分组**:通过`agenda-group`控制规则执行顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值