规则引擎的应用
Posted 断剑重铸之时
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了规则引擎的应用相关的知识,希望对你有一定的参考价值。
java开源的规则引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最为广泛并且开源的是Drools。
规则引擎的优点
-
声明式编程
规则可以很容易地解决困难的问题,并得到解决方案的验证。与代码不同,规则以较不复杂的语言编写; 业务分析师可以轻松阅读和验证一套规则。 -
逻辑和数据分离
数据位于“域对象”中,业务逻辑位于“规则”中。根据项目的种类,这种分离是非常有利的。 -
速度和可扩展性
写入Drools的Rete OO算法已经是一个成熟的算法。在Drools的帮助下,您的应用程序变得非常可扩展。如果频繁更改请求,可以添加新规则,而无需修改现有规则。 -
知识集中化
通过使用规则,您创建一个可执行的知识库(知识库)。这是商业政策的一个真理点。理想情况下,规则是可读的,它们也可以用作文档。Drools 介绍
Drools 是一个基于Charles Forgy’s的RETE算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。 业务分析师人员或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。
Drools 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声明方式表达业务逻辑。可以使用非XML的本地语言编写规则,从而便于学习和理解。并且,还可以将Java代码直接嵌入到规则文件中,这令Drools的学习更加吸引人。
Drools优点:
- 非常活跃的社区支持
- 易用
- 快速的执行速度
- 在 Java 开发人员中流行
- 与 Java Rule Engine API(JSR 94)兼容
Drools相关概念:
- 事实(Fact):对象之间及对象属性之间的关系
- 规则(rule):是由条件和结论构成的推理语句,一般表示为if…Then。一个规则的if部分称为LHS,then部分称为RHS。
- 模式(module):就是指IF语句的条件。这里IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。
Drools通过 事实、规则和模式相互组合来完成工作,drools在开源规则引擎中使用率最广,但是在国内企业使用偏少,保险、支付行业使用稍多。
简易实例代码:
drools有专门的规则语法drl,就是专门描述具体业务的规则是如何执行的:
package com.zhaozhi.spider.service.drools; rule "Drools Introduction" when $droolsIntro : DroolsIntroduction( topic == "Drools" ) then System.out.println($droolsIntro.introduceYourself()); end
xml配置:
<?xml version="1.0" encoding="UTF-8"?> <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> <kbase name="rules" packages="rules"> <ksession name="ksession-rules"/> </kbase> </kmodule>
相关类与测试:
public class DroolsIntroduction { private String topic; public DroolsIntroduction(String topic) { this.topic = topic; } public String getTopic() { return topic; } public String introduceYourself() { return "Drools 6.2.0.Final"; } } public class DroolsRules { public static void fireAllRules(List<Object> rules){ try { KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession("ksession-rules"); for(Object rule:rules){ if(rule!=null){ kSession.insert(rule); } } kSession.fireAllRules(); } catch (Throwable t) { t.printStackTrace(); } } } public class DroolsTest { @Before public void setUp() throws IOException { } @Test public void test(){ List<Object> rules = Lists.newArrayList(); rules.add(new DroolsIntroduction("hello")); rules.add(new DroolsIntroduction("Drools")); DroolsRules.fireAllRules(rules); } }
以上是关于规则引擎的应用的主要内容,如果未能解决你的问题,请参考以下文章