spring整合drools

  • Post author:
  • Post category:其他




依赖

pom.xml

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.10.0.Final</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>



创建drools的配置文件

kmodule.xml

<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://www.drools.org/xsd/kmodule">
    <!--
        name:指定kbase的名称,可以任意,但是需要唯一
        packages:指定规则文件的目录,需要根据实际情况填写,否则无法加载到规则文件
        default:指定当前kbase是否为默认
    -->
    <kbase name="myKbase" packages="rules" default="true">
        <!--
            name:指定ksession名称,可以任意,但是需要唯一
            default:指定当前session是否为默认
        -->
        <ksession name="ksession" default="true"/>
    </kbase>
</kmodule>


注:配置文件的名称必须为”kmodule”,不能改变,并且他必须位于”resources/META-INF”目录下。



创建Fact(实体类)

package com.my.drools.pojo;

public class Order {

	private Double originalPrice;
    private Double realPrice;
    
	public Double getOriginalPrice() {
		return originalPrice;
	}
	public void setOriginalPrice(Double originalPrice) {
		this.originalPrice = originalPrice;
	}
	public Double getRealPrice() {
		return realPrice;
	}
	public void setRealPrice(Double realPrice) {
		this.realPrice = realPrice;
	}
}



创建规则文件

bookDiscount.drl

//图书优惠规则
package book.discount
import com.my.drools.pojo.Order

//规则一:所购图书总价在100元以下的没有优惠
rule "first_book_discount"
    when
    	/**
    	 * 模式匹配,到规则引擎(工作内存)中寻找满足条件的Order,
    	 * 即当"originalPrice < 100"时,
    	 * 将工作内存中的这个满足条件的"Order"对象,
    	 * 赋值给变量"$order",并且执行"then"后面的逻辑
    	 */
    	
        $order:Order(originalPrice < 100)
    then
        $order.setRealPrice($order.getOriginalPrice());
        System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");
end

//规则二:所购图书总价在100到200元的优惠20元
rule "second_book_discount"
    when
        $order:Order(originalPrice < 200 && originalPrice >= 100)
    then
        $order.setRealPrice($order.getOriginalPrice() - 20);
        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end

//规则三:所购图书总价在200到300元的优惠50元
rule "third_book_discount"
    when
        $order:Order(originalPrice <= 300 && originalPrice >= 200)
    then
        $order.setRealPrice($order.getOriginalPrice() - 50);
        System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");
end

//规则四:所购图书总价在300元以上的优惠100元
rule "fourth_book_discount"
    when
        $order:Order(originalPrice >= 300)
    then
        $order.setRealPrice($order.getOriginalPrice() - 100);
        System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");
end


注:改规则文件必须创建在drools配置文件中的” “标签中的”packages”属性的目录中。



测试类

TestDrools.java

package com.my.drools.test;


import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

import com.my.drools.pojo.Order;

public class TestDrools {

	@Test
	public void test1(){
		//获取KieServices对象
	    KieServices kieServices = KieServices.Factory.get();
	    /**
	     * 创建KieContainer容器,
	     * 容器会到"/com.my/src/main/resources/META-INF/kmodule.xml"
	     * 配置文件中配置的目录(此处为"/com.my/src/main/resources/rules")中加载规则文件
	     */
	    KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
	   
	    
	    //会话对象,用于和规则引擎交互
	    KieSession kieSession = kieClasspathContainer.newKieSession();
	    
	    //构造订单对象,设置原始价格,由规则引擎根据优惠规则计算优惠后的价格
	    Order order = new Order();
	    order.setOriginalPrice(210D);

	    /*
	     * 将数据提供给规则引擎(工作内存),
	     * 规则引擎会根据提供的数据进行规则匹配,
	     * 如果不将对象插入到工作内存中,这不会进行规则匹配,
	     * 因为工作内存中是空的
	     */
//	    kieSession.insert(order);

	    //激活规则引擎,如果规则匹配成功则执行规则
	    kieSession.fireAllRules();
	    //关闭会话
	    kieSession.dispose();
		/**
	     * 如果触发规则文件后,
	     * 规则文件会将我们插入到工作内存中的对象返回
	     */
	    System.out.println("优惠前原始价格:" + order.getOriginalPrice() +
	                       ",优惠后价格:" + order.getRealPrice());
	}
}



版权声明:本文为weixin_38613375原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。