rule_rules新鲜出炉
今天我们介绍另一款规则引擎——rulebook。RuleBook规则是按照Java开发人员的思维方式构建的(Java代码)。它们以程序员所期望的
今天我们介绍另一款规则引擎——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