规则引擎的应用

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);
          }
          
          
          
      }

       maven依赖:

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <groupId>com.javacodegeeks.drools</groupId>
          <artifactId>droolsHelloWorld</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      
          <dependencies>
              <dependency>
                  <groupId>org.drools</groupId>
                  <artifactId>drools-compiler</artifactId>
                  <version>${drools.version}</version>
              </dependency>        
          </dependencies>
          <properties>
              <drools.version>6.2.0.Final</drools.version>
              <jbpm.version>6.2.0.Final</jbpm.version>
          </properties>
      </project>

       

posted on 2017-10-23 15:57  断剑重铸之时  阅读(777)  评论(0编辑  收藏  举报