zoukankan      html  css  js  c++  java
  • drools原生drl规则文件的使用

    初识drools中对drl文件进行了简单的介绍。这里举个例子来具体说明下。主要是写了规则之后我们如何用java代码来run起来。

    drl文件内容如下:


    rule "ageUp12" when
     $student: Student(age > 2)
    then
     $student.ageUp12();
    end

    rule "nameMax" when
     $student: Student(name == "max")
    then
     $student.nameMax();
    retract($student);
    end

    rule "class" when
     $student:Student()
    then
     $student.toString();
    retract($student);
    end

    rule "testList" when
     $student : Student($age : age)
    not Student(age < $age)
    then
     System.out.println("age = " + $age);
    retract($student);//这里导致了LHS的变化 然后会重新触发规则的匹配慎用 这里只是为了展示排序的例子,然后这个rule可以排序。。。。
     end

    我们在文件中import了一个Student类,代码很简单,就是一个javaBean,里面有两个字段:int age和String name;然后还有几个方法,ageUp12(),nameMax()

    然后我们怎么把这个文件和java代码关联起来呢,直接上代码

    KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    //ResourceFactroy是个获取各种资源的工厂,比如newUrlResource,这里ResourceType指明了规则文件的类型,里面有我们在决策表中用到的xls哦
    knowledgeBuilder.add(ResourceFactory.newClassPathResource("drools/mydrools.drl"), ResourceType.DRL);
    KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
    knowledgeBase.addKnowledgePackages(knowledgeBuilder.getKnowledgePackages());
    StatefulKnowledgeSession knowledgeSession = knowledgeBase.newStatefulKnowledgeSession();
    Student student = new Student(13,"max");
    Student student1 = new Student(11,"max");
    knowledgeSession.insert(student);//具体的java类对象添加到workingMemory中。
    knowledgeSession.insert(student1);
    knowledgeSession.fireAllRules();

    在这段代码里我们看到 最后真正去执行的是一个叫做knowledgeSession的东西,这是一个会话,实现了KieSession接口,这个接口的实现类本身包含数据,规则并且执行真正的操作。在规则表里面还会提到。

    然后前面我们构造了一个KnowledgeBuilder,来把规则文件加载到drools里,然后构造了一个KnowledgeBase,并从这个KnowlegeBase中获取一个实际操作的会话。

    这里对这几个class做一下简单介绍:

    KnowledgeBuilder主要是加载规则文件到drools规则引擎中,用于根据规则引擎文件来构造知识仓库。

    KnowledgeBase是对一个规则文件的抽象,可以看下他的父类接口KieBase,在英文文档中是这么介绍的:KieBase就是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession

    StatefulKnowledgeSession是一个KieSession实现类,这个接口在英文文档中是这么介绍的:KieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算

    注:这里用到的几个class都是kie-api中的类,这个api在drools中的作用非常之重要,我们在前面的博客里已经有所讲解。而且也是决策表中的主要组件。

     

     

     
     
    编写评论...
  • 相关阅读:
    JVM基础系列第1讲:Java 语言的前世今生
    JVM基础系列开篇:为什么要学虚拟机?
    2018 精选文章集合
    如何唯一确定一个 Java 类?
    Java 中的 try catch 影响性能吗?
    不读大学也能成功,七个读大学的备用选择
    【中间件安全】IIS7.0 安全加固规范
    【中间件安全】Apache 安全加固规范
    Excel 保护工作表
    【应用安全】S-SDLC安全开发生命周期
  • 原文地址:https://www.cnblogs.com/yuebintse/p/5768060.html
Copyright © 2011-2022 走看看