首先以通俗的语言表达何为规则引擎:
一段代码:
上述代码中循环了100次,从1开始循环+1.
如果当前数字能被5、7整除。打印:能被5和7同时整除的数字
其余的数字依次打印出来。
其实上面例子中的如果就是我们希望的规则,由此可见当我们业务上遇到较为复杂多样的规则的时候,代码中会出现满篇的if–else。降低代码的易读性、增加代码行数,后期修改规则繁复等等的弊端都体现出来。因此我们用到了规则引擎,也就是今天的主人公——easy-rules。
Easy Rules是一个简单但功能强大的Java规则引擎,提供以下特性:
- 轻量级框架和易于学习的API
- 基于POJO的开发
- 支持从原始规则创建组合规则
- 支持通过表达式(如MVEL,SPEL和JEXL)定义规则
先从一段源码来了解:
evaluate()方法封装了必须为true才能触发规则的条件。
execute()方法封装了在满足规则条件时应该执行的操作。
条件和操作由Condition和Action接口表示。
总结来说,我们可以通过定义Condition来判断是否执行此规则,通过Action来决定执行什么样的规则。
上面大概讲述了一下rule的基本结构,下面我们来探讨下究竟如何使用:
完整的示例需要几个东西要讲一下,大家耐心看完:
- 第一点:Easy Rules提供了注解,可以将POJO转换为规则
上面代码中,我们自己通过注解的方式先定义了一个规则,以及规则是否执行的条件,执行的内容。
- 第二点:上面代码中的注解是什么意思呢?
源码:
实际上是一个事实,name代表了在事实中的命名,value则是实际要传递的参数。
Facts API表示一组事实 所以在同一空间内,fact的name不可重复。
- 第三点:建立规则引擎
规则引擎参数
Easy Rules引擎可以配置以下参数:
- :当优先级超过指定的阈值时,跳过余下的规则。
- :当一个规则成功应用时,跳过余下的规则。
- :当一个规则失败时,跳过余下的规则。
- :当一个规则未触发时,跳过余下的规则。
示例:
简单了解了以上三点,便可以进行一个简单的程序了:
按照我们开篇的例子来说
循环100次,从1开始循环+1.
如果当前数字能被5、7整除。打印:能被5和7同时整除的数字
其余的数字依次打印出来。
把上述规则建立起来 ↓
使用: