IT·互联网·资源DroolsJava

Drools介绍与使用

2016-05-06  本文已影响2680人  九都散人

Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法对所编写的规则求值。Drools 允许使用声明方式表达业务逻辑。可以使用非 XML 的本地语言编写规则,从而便于学习和理解。并且,还可以将 Java 代码直接嵌入到规则文件中,这令 Drools 的学习更加吸引人。

Drools 还具有其他优点:
Drools 是业务逻辑集成平台,被分为4个项目:

官网:http://www.drools.org/#
官方文档:http://www.drools.org/learn/documentation.html

Drools语法

规则文件

规则文件可以使用 .drl文件,也可以是xml文件,这里我们使用drl文件

规则文件

package:对一个规则文件而言,package是必须定义的,必须放在规则文件第一行,package的名字是随意的,不必必须对应物理路径,跟java的package的概念不同,这里只是逻辑上的一种区分

如:
package com.sankuai.meituan.waimai.drools.demo

import:导入规则文件需要使用到的外部规则文件或者变量,这里的使用方法跟java相同,但是不同于java的是,这里的import导入的不仅仅可以是一个类,也可以是这个类中的某一个可访问的静态方法

import com.drools.demo.point.PointDomain;

rule:定义一个具体规则。rule "ruleName"。一个规则可以包含三个部分:

rule部分
rule "ruleName"
     no-loop true

     when
         $message:Message(status == 0)

     then
         System.out.println("fit");
         $message.setStatus(1);
         update($message);
end
规则详情
属性详情
**rule attributes**
条件部分- LHS
when
      eval(true)
      $customer:Customer()
      $message:Message(status==0)
操作符
  • contains: 对比是否包含操作,操作的被包含目标可以是一个复杂对象也可以是一个简单的值
    Person( fullName not contains "Jr" )
  • not contains:与contains相反。
  • memberOf:判断某个Fact属性值是否在某个集合中,与contains不同的是他被比较的对象是一个集合,而contains被比较的对象是单个值或者对象
    CheeseCounter( cheese memberOf $matureCheeses )
  • not memberOf:与memberOf正好相反
  • matches:正则表达式匹配
    Cheese( type matches "(Buffalo)?\\S*Mozarella" )
    注意: 就像在Java中,写为字符串的正则表达式需要转义“\”
  • not matches:与matches正好相反
结果部分- RHS

当规则条件满足,则进入规则结果部分执行,结果部分可以是纯java代码

then
     System.out.println("OK"); //会在控制台打印出ok
end
rule "Rule 03" 
      when 
          $number : Number( ) 
          not Number( intValue < $number.intValue ) 
      then 
          System.out.println("Number found with value: " + $number.intValue() ); 
          retract( $number );
end
Drools关键词
关键词 描述 详情
lock-on-active
date-effective
date-expires
no-loop
auto-focus
activation-group
agenda-group
ruleflow-group
entry-point
duration
package
import
dialect
salience
enabled
attributes
rule
extend
when
then
template
query
declare
function
global
eval
not
in
or
and
exists
forall
accumulate
collect
from
action
reverse
result
end
over
init -
Drools方法定义
function String hello(String name) { 
      return "Hello "+name+"!";
}
Drools声明类型
  • 声明Class、Enum etc类型
  • 声明元数据
声明类类型
declare  Address 
    number : int 
    streetName : String 
    city : String
end
声明枚举类型
declare enum DaysOfWeek
    SUN("Sunday"),MON("Monday"),TUE("Tuesday"),WED("Wednesday"),THU("Thursday"),FRI("Friday"),SAT("Saturday"); 
    fullName : String
end
声明元数据类型

元数据可以被分配给在Drools中几个不同的结构:

定义格式:
@metadata_key(metadata_value)
例子:
@author( Bob )

import java.util.Date
    declare Person 
    @author( Bob ) 
    @dateOfCreation*( 01-Feb-2009 ) 
    name : String @key @maxLength*( 30 ) 
    dateOfBirth : Date address : Address
end

声明元数据类级别 关键词

import some.package.StockTick
declare StockTick 
    @role ( event )
end
declare VoiceCall 
    @role( event ) 
    @timestamp( callDateTime )
end

声明元数据属性级别 关键词

两个方面影响:

  • 根据@key作为类标识符,类比较以 @key 的字段为准
  • 根据@key字段生成构造函数
declare Person 
    firstName : String @key 
    lastName : String @key 
    age : int
end
declare Cheese 
    name : String @position(1) 
    shop : String @position(2) 
    price : int @position(0)
end

设计

Drools vs ILog vs Jess vs Mandarax

优点
Drools 开源、社区非常活跃、易使用、免费、JSR94兼容(JSR94是Java Rule Engine API)、支持Java、强大的工具集 只支持一种推理方式、安全性不够
ILog 性能高(电信领域使用)、易使用 商业产品、不开源
Jess 支持2种推理方式(正向链和反向链)、很强的表示、推理能力、支持AOP 不开源、无规则管理工具、不易使用
Mandarax 开源、免费、支持Java JSR94不兼容(JSR94是Java Rule Engine API)、已经不更新、社区不活跃、并且文档不全
推理方式

作者 @九都散人
2016 年 5月 6日


参考:
Jess 反向链推理机理及诊断专家系统开发模式研究
http://www.docin.org/p-86340503.html
Drools 6.4 Final 文档

上一篇 下一篇

猜你喜欢

热点阅读