首页 > 编程知识 正文

轻量级规则引擎,流程引擎和规则引擎

时间:2023-05-06 18:14:46 阅读:114698 作者:932

接触过Drools的同学都会被复杂的Api给难住,简直就是入门到放弃的一个过程,而EasyRule就是Drools的简化版,裁剪了部分使用场景非常少的复杂功能,也简化了很多Drools中的组件,这样我们在使用EasyRule的时候对于API理解就非常容易了

什么是Easy Rules? Easy Rules是一个简单的JAVA开源规则引擎,它提供了规则抽象,用于创建包含条件评估和操作执行的规则。 规则引擎API运行一组规则来评估条件和执行操作。

特征轻量级类库中易于学习的基于APIPOJO的注释编程模型开发高效抽象,便于定义业务规则,便于在JAVA中应用它们,支持在原始规则中创建复合规则,支持在可支持语言中定义规则的功能组件(例如结构规则(规则)业务规则,如HashMap,包括条件评估和操作执行,如果条件评估结果为true,则执行相应的操作; 规则引擎(Rule Engine )以指定方式运行规则; 规则监听(Rule Listener )监听规则的执行情况; 监听规则引擎(Rule Engine Listener )监听规则引擎的运行情况; 案例定义规则

注释定义规则:

@rule(name='weatherrule ',description=' ifitrainsthentakeanumbrella ' ) publicclassweatherrule ) @ conditionpublionpublicbobrer ' ); }流编程方式定义规则:

ruleweatherrule=newrulebuilder (.name ) weatherrule ).description (ifitrainsthentakeanumbrella ).when ) ) . equals(true ) ).then ) facts-system.out.println ),take an umbrella! ' ).build (; 在公式中定义规则:

ruleweatherrule=newmvelrule (.name ) weatherrule ).description (ifitrainsthentakeanumbrella ).When () )。 ); yml文件方式定义规则:

name : ' weather rule ' description : ' ifitrainsthentakeanumbrella ' condition 3360 ' rain==true ' actions 3360-' scraions ruleweatherrule=mvelrulefactory.createrulefrom (new file (' weather-rule.yml ' ); 执行规则:

公共类测试{ publicstaticvoidmain (字符串[ ] args )//definefactsfacts=newfacts ); acts.put('rain ',true ); //definerulesruleweatherrule=. rules rules=new rules (); Rules.Register(Weatherrule ); //firerulesonknownfactsrulesenginerulesengine=newdefaultrulesengine (; RulesEngine.fire(Rules,facts ); }具体场景案例的场景说明:

假设有这样的场景:

一个数字能被5整除时,输出" fizz "; 一个数字能被7整除时,输出" buzz "; 如果一个数字可以同时被5和7整除,则输出" fizzbuzz "; 如果一个数字不满足上述三个条件,则输出该数字本身。 不使用规则引擎的实现:

publicclassfizzbuzzmain { publicstaticvoidmain (string [ ] args ) for ) intI=1;

i <= 100; i++) { if (((i % 5) == 0) && ((i % 7) == 0)) System.out.print("fizzbuzz"); else if ((i % 5) == 0) System.out.print("fizz"); else if ((i % 7) == 0) System.out.print("buzz"); else System.out.print(i); System.out.println(); } System.out.println(); }}

使用Easy Rules实现:

1. 引入依赖

<dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-core</artifactId> <version>3.2.0</version></dependency> <dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-support</artifactId> <version>3.2.0</version></dependency><dependency> <groupId>org.jeasy</groupId> <artifactId>easy-rules-mvel</artifactId> <version>3.2.0</version></dependency>

2. 使用注解方式定义规则:

2.1 定义规则:

public class RuleClass { @Rule(priority = 1) public static class FizzRule { @Condition public boolean isFizz(@Fact("number") int number) { return number % 5 == 0; } @Action public void printFizz() { System.out.print("fizz"); } } @Rule(priority = 2) public static class BuzzRule { @Condition public boolean isBuzz(@Fact("number") int number) { return number % 7 == 0; } @Action public void printBuzz() { System.out.print("buzz"); } } public static class FizzBuzzRule extends UnitRuleGroup { public FizzBuzzRule(Object... rules) { for (Object rule : rules) { addRule(rule); } } @Override public int getPriority() { return 0; } } @Rule(priority = 3) public static class NonFizzBuzzRule { @Condition public boolean isNotFizzNorBuzz(@Fact("number") int number) { return number % 5 != 0 || number % 7 != 0; } @Action public void printInput(@Fact("number") int number) { System.out.print(number); } }}

2.2 客户端调用:

public class FizzBuzzMainWithRule { public static void main(String[] args) { // create a rules engine RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true); RulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters); // create rules Rules rules = new Rules(); rules.register(new FizzRule()); rules.register(new BuzzRule()); rules.register(new FizzBuzzRule(new FizzRule(), new BuzzRule())); rules.register(new NonFizzBuzzRule()); // fire rules Facts facts = new Facts(); for (int i = 1; i <= 100; i++) { facts.put("number", i); fizzBuzzEngine.fire(rules, facts); System.out.println(); } }}

3. 使用yml文件定义规则:

3.1 定义规则:

---name: "fizz rule"description: "print fizz if the number is multiple of 5"priority: 1condition: "number % 5 == 0"actions:- "System.out.println("fizz")"---name: "buzz rule"description: "print buzz if the number is multiple of 7"priority: 2condition: "number % 7 == 0"actions:- "System.out.println("buzz")"---name: "fizzbuzz rule"description: "print fizzbuzz if the number is multiple of 5 and 7"priority: 0condition: "number % 5 == 0 && number % 7 == 0"actions:- "System.out.println("fizzbuzz")"---name: "non fizzbuzz rule"description: "print the number itself otherwise"priority: 3condition: "number % 5 != 0 || number % 7 != 0"actions:- "System.out.println(number)"

3.2 客户端调用:

public class FizzBuzzMainWithYmlRule { public static void main(String[] args) throws FileNotFoundException { // create a rules engine RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true); RulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters); // create rules String filePath = System.getProperty("user.dir") + "/src/main/resources/easyrules/fizzbuzz/rule.yml"; Rules rules = MVELRuleFactory.createRulesFrom(new FileReader(filePath)); // fire rules Facts facts = new Facts(); for (int i = 1; i <= 100; i++) { facts.put("number", i); fizzBuzzEngine.fire(rules, facts); System.out.println(); } }} 更多事例 Easy Rules官方wiki参考 Easy Rules官方文档

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。