Drools 语法

规则语法
package: package 的名字是随意的,不必必须对应物理路径
import: 导入外部变量

规则的编译与运行要通过Drools 提供的各种API 来实现。
API 分为三类:规则编译、规则收集、规则执行
主要API:
KnowledgeBuilder 用来在业务代码中收集已经编写好的规则,对这些规则文件进行编译,最终产生一批编译好的规则包 knowledgePackage 给其他程序使用。
KnowledgeBase
StatefulKnowledgeSession
StatelessKnowledgeSession
它们起到了对 规则文件进行收集、编译、查错、插入fact、设置global、执行规则或者规则流

KnowledgeBuilder

   用来在业务代码中收集已经编写好的规则,对这些规则文件进行编译,最终产生一批编译好的规则包 knowledgePackage 给其他程序使用。KnowledgeBuilder在编译规则的时候可以通过其提供的hasErrors()方法得到编译规则过程中发现规则是否有错误,如果有的话通过其提供的getErrors()方法将错误打印出来,以帮助我们找到规则当中的错误信息。

KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("test.drl", Test.class),ResourceType.DRL); if(kbuilder.hasErrors()){
  System.out.println("规则中存在错误,错误消息如下:");
  KnowledgeBuilderErrors kbuidlerErrors=kbuilder.getErrors();
  for(Iterator iter=kbuidlerErrors.iterator();iter.hasNext();)
  {
    System.out.println(iter.next());
  }
} Collection<KnowledgePackage> kpackage=kbuilder.getKnowledgePackages();//产生规则包的集合

  

通过KnowledgeBuilder编译的规则文件的类型可以有很多种,如.drl文件、.dslr文件或一个xls文件等。

KnowledgeBase

  KnowledgeBase 是Drools 提供的用来收集应用当中知识(knowledge)定义的知识库对象

可以包含 普通的规则(rule)、规则流(rule flow)、函数定义(function)、用户自定义对象(type model)

  kenowledgeBase 本身不包含任何业务数据对象(fact)。

  业务对象是插入到 knowledgeBase 产生的两种类型的Session对象中(StatefulKnowledgeSession 和 StatelessKnowledgeSession),通过Session对象可以触发规则执行和开始一个规则流执行

  KnowledgeBaseConfiguration对象是一个用来存放规则引擎运行时相关环境参数定义的配置对象

StatefulKnowledgeSession

  对象是一种最常用的与规则引擎进行交互的方式,它可以与规则引擎建立一个持续的交互通道,在推理计算的过程当中可能会多次触发同一数据集。在用户的代码当中,最后使用完StatefulKnowledgeSession对象之后,一定要调用其dispose()方法以释放相关内存资源。

  在drools 规则引擎中,fact 所承担的作用就是讲规则中要用到的业务数据从应用当中传入进来,对于规则当中产生的数据及状态的变化通常不用fact 传出。如果需要数据传出,那么 设置global对象来实现。

在spring的applicationContext.xml中,加入:

<kie:import releaseId-ref="ksession-releaseId" enableScanner="true" scannerInterval="300000"/>
<kie:releaseId id="ksession-releaseId" groupId="com.test" artifactId="epay-risk" version="LATEST"/>

<bean id="kiePostProcessor"
            class="org.kie.spring.annotations.KModuleAnnotationPostProcessor"/>

引入的目的是实现动态刷新规则jar包的规则。配置的时间是5分钟刷新一遍,最终实现业务规则的更新,不需要重启机器。加入以上配置后,eclipse报错,无法辨认kie:import等标签,需要在xml中加入:xmlns:kie="http://drools.org/schema/kie-spring"
还有:http://drools.org/schema/kie-spring https://raw.githubusercontent.com/droolsjbpm/droolsjbpm-integration/master/kie-spring/src/main/resources/org/kie/spring/kie-spring-6.0.0.xsd

04-29 02:05