rule_rules新鲜出炉

Mark wiens

发布时间:2024-09-21

今天我们介绍另一款规则引擎——rulebook。RuleBook规则是按照Java开发人员的思维方式构建的(Java代码)。它们以程序员所期望的

rule_rules新鲜出炉

 

今天我们介绍另一款规则引擎——rulebookRuleBook规则是按照Java开发人员的思维方式构建的(Java代码)它们以程序员所期望的方式执行(按order)RuleBook还允许您使用易于使用的Lambda支持的Domain特定语言或使用您定义的pojo来指定规则。

厌倦了充斥着if/then/else语句的类?需要一个良好的抽象,允许规则以一种相互解耦的方式轻松指定?想要用编写其他代码(Java)相同的方式编写规则吗?RuleBook可能就是您一直在等待的规则抽象!——RuleBook(。

https://github.com/deliveredtechnologies/rulebook)其用法跟easyrule有很多相似之处,所以这里就不细讲他的用法了这篇文章主要讲他与easyrule的差异。

安装:easyrule文档上提供了两种方式:1 从git源码构建;2 mavenrulebook文档上提供了三种方式:1 从git源码构建;2 maven;3 gradle这个差别不算太大,gradle与maven类似。

所以在getting start上,没有太大的区别定义规则方式:都有builder方式,都有pojo的方式rulebook和easyrule都可以通过继承重写来自定义自己的rulerulebook是继承CoRRuleBook,实现的是RuleBook接口。

这里rulebook写了一个注意,定义的rule可以单例使用,不用考虑并发问题,但是事实集不行:RuleBooks是线程安全的然而,FactMaps和NameValueReferableMap的其他实现却不是。

这意味着RuleBook的单个实例可以使用不同的Facts在不同的线程中运行,而不会产生意外的结果然而,在不同的线程中使用相同的FactMap可能会导致意想不到的结果Facts表示RuleBook的单个调用时的数据,而RuleBooks表示可重用的规则集。

通过注解方式定义:二者均支持RuleBook的基本注解是Given-When-Theneasyrule支持动态调序;RuleBook不支持,order是@Rule的一个参数easyrule提供了一个规则组的概念;rulebook没有。

easyrule的引擎参数全局设置规则调用方式;rulebook使用RuleChainActionType来设置,但不是全局的,而是rule上的RuleChainActionType描述CONTINUE_ON_FAILURE。

默认的RuleChainActionType错误的规则条件和错误有效地“跳过”规则ERROR_ON_FAILURE规则抛出的异常会停止规则链,并将异常作为RuleException向上throwSTOP_ON_FAILURE。

如果规则的条件为false或抛出异常,将会停止规则链rulebook在规则创建时用stop()可以判断触发规则后是否继续执行引擎//当getCreditScore为500时,因为有stop(),不会触发第二个规则。

//credit score under 600 gets a 4x rate increase addRule(RuleBuilder.create().withFactType(ApplicantBean

.class).withResultType(Double.class) .when(facts -> facts.getOne().getCreditScore() result.setValue(result.getValue() *

4)) .stop() .build()); //credit score between 600 and 700 pays a 1 point increase addRule(RuleBuilder.create().withFactType(ApplicantBean

.class).withResultType(Double.class) .when(facts -> facts.getOne().getCreditScore() result.setValue(result.getValue() +

1)) .build());Auditing Rules 规则审计rulebook有一个特殊的功能,asAuditor(),来启动规则审计通过使用asAuditor(),RuleBook中的每个规则都可以将自己注册为一个Auditable rule(如果指定了它的名称)。

每个添加到RuleBook Auditor的可审计规则在RuleBook中都有其状态记录当规则在RuleBook中注册为可审计时,它们的RuleStatus为NONE在运行RuleBook之后,对于所有失败或其条件未评估为true的规则,它们的RuleStatus将被更改为SKIP。

对于条件评估为true且then()操作成功完成的规则,其RuleStatus将更改为EXECUTED这个做多线程异步审计,审批流时,比较有帮助将rule定义成spring bean上面讲了,Rule单例的,所以能够用spring托管。

需要引入下面的jar:com.deliveredtechnologiesrulebook-spring

>0.12package com.exampl.rulebook.helloworld.component; @Componentpublic

classHelloWorldComponent{ public String getHelloWorld(String hello, String world){ return hello +

" " + world + "!"; } }package com.example.rulebook.helloworld; @RuleBean@Rule(order = 1) publicclass

HelloSpringRule{ @Given("hello") private String hello; @Resultprivate String result; @Whenpublic

booleanwhen(){ return hello != null; } @Thenpublicvoidthen(){ result = hello; } } package

com.example.rulebook.helloworld; @RuleBean@Rule(order = 2) publicclassWorldSpringRule{ @Autowired HelloWorldComponent helloWorldComponent;

@Given("world") private String world; @Resultprivate String result; @Whenpublicbooleanwhen(){

return world != null; } @Thenpublicvoidthen(){ result = helloWorldComponent.getHelloWorld(result, world); } }

@Configuration@ComponentScan("com.example.rulebook.helloworld") publicclassSpringConfig{ @Beanpublic

RuleBook ruleBook(){ RuleBook ruleBook = new SpringAwareRuleBookRunner("com.example.rulebook.helloworld"

); return ruleBook; } }@Autowiredprivate RuleBook ruleBook; publicvoidprintResult(){ NameValueReferableMap facts =

new FactMap<>(); facts.setValue("hello", "Hello "); facts.setValue("world", "World"); ruleBook.run(facts); ruleBook.getResult().ifPresent(System.out::println);

//prints Hello World! }这样我们是不是可以在rulebook的规则中使用spring的各种bean了,是不是有点小激动?有了这个功能,似乎刚才与easyrule有差异的那些短板都是毛毛雨啦,哈哈。

期待哪位大神把easyrule也弄出来个spring版本总的来说,easyrule跟rulebook没有太大的差异,easyrule的扩展包能支持很多el表达式;rulebook支持了spring托管,带审计功能。

具体在项目中如何选用,需要根据不同的需求来考虑了

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186