drools 规则引擎
Drools基本语法:
传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后
得到的结果。
在drools中,这个传递数据进去的对象,术语叫Fact对象,Fact对象是一个普通的java bean
规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法
当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,通过fact对象的读写
对其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的Fact对象
规则文件可以使用.drl/.xml
使用规则:
package:对于一个规则文件而已,package是必须定义的,必须放在规则文件第一行
import:导入规则文件需要使用到的外部变量,导入的不仅仅可以是一个类,也可以是这个类
中的某一个可访问的静态方法
rule:定义一个规则,一个规则同时包含三个部分
1、属性部分,定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等
2、条件部分,即LHS定义当前规则的条件,如:when Message判断当前workingMemory中是否存在Message对象
3、结果部分,即RHS可以写普通的java代码,即当前规则条件满足后执行的操作,可以直接访问fact对象的方法来操作
例如:
rule "name"
no-loop true
when
$message:Message(status == 0)
then
System.out.println("fit");
$message.setStatus(1);
update($message);
end
传递进去数据,用于规则的检查,调用外部接口,同时还可能需要获取到规则执行完毕后
得到的结果。
在drools中,这个传递数据进去的对象,术语叫Fact对象,Fact对象是一个普通的java bean
规则中可以对当前的对象进行任何的读写操作,调用该对象提供的方法
当一个java bean插入到workingMemory中,规则使用的是原有对象的引用,通过fact对象的读写
对其中的属性,需要提供getter setter访问器,规则中,可以动态的往当前workingMemory中插入删除新的Fact对象
规则文件可以使用.drl/.xml
使用规则:
package:对于一个规则文件而已,package是必须定义的,必须放在规则文件第一行
import:导入规则文件需要使用到的外部变量,导入的不仅仅可以是一个类,也可以是这个类
中的某一个可访问的静态方法
rule:定义一个规则,一个规则同时包含三个部分
1、属性部分,定义当前规则执行的一些属性等,比如是否可被重复执行、过期时间、生效时间等
2、条件部分,即LHS定义当前规则的条件,如:when Message判断当前workingMemory中是否存在Message对象
3、结果部分,即RHS可以写普通的java代码,即当前规则条件满足后执行的操作,可以直接访问fact对象的方法来操作
例如:
rule "name"
no-loop true
when
$message:Message(status == 0)
then
System.out.println("fit");
$message.setStatus(1);
update($message);
end
no-loop:定义当前的规则是否不允许多次循环执行,默认是false,也就是当前的规则只要满足条件,可以无限次执行
基本的文件样式如下:
pom.xml引入的:
<dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> </dependency>
定义Fact实体Product:
public class Product {
public static final String DIAMOND = "DIAMOND"; // 钻石
public static final String GOLD = "GOLD"; // 黄金
private String type;
private int discount;
//get,set省略
}
规则文件:
package com.rules
import cn.no7player.model.Product
rule Offer4Diamond
when
productObject : Product(type == Product.DIAMOND)
then
productObject.setDiscount(100);
end
rule Offer4Gold
when
productObject : Product(type == Product.GOLD)
then
productObject.setDiscount(75);
end
kmodule.xml
<?xml version="1.0" encoding="UTF-8" ?> <kmodule xmlns="http://www.drools.org/xsd/kmodule"> <kbase name="rules" packages="com.rules"> <ksession name="ksession-rule"/> </kbase> </kmodule>Demo测试如下:
package cn.no7player.test; import cn.no7player.model.Product; import org.junit.Test; import org.kie.api.KieServices; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; public class DroolsTest{ @Test public void testRules(){ KieServices ks = KieServices.Factory.get(); KieContainer kieContainer = ks.getKieClasspathContainer(); //获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。 KieSession kSession = kieContainer.newKieSession("ksession-rule"); Product product = new Product(); product.setType(Product.DIAMOND); kSession.insert(product); int count = kSession.fireAllRules(); System.out.println("命中了"+count+"条规则"); System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%"); } }
运行的结果如下:
命中了1条规则
商品DIAMOND的商品折扣为100%