-
在Eclipse中创建Maven Web Project
此处省略,请Google。
-
构建pom.xml,添加相关依赖包
由于仅使用Spring, Spring MVC,drools,只需要添加这些包依赖即可,此处只贴上来drools的相关依赖配置,如下图所示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.0.RELEASE</spring.version>
<drools.version>6.4.0.Final</drools.version>
</properties>
<!-- Drools Begin -->
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>knowledge-api</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-internal</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
</dependency>
<!-- <dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId>
<version>${drools.version}</version> </dependency> -->
<dependency>
<groupId>org.jbpm</groupId>
<artifactId>jbpm-kie-services</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- Drools End !-->
注意:这里的kie-ci是被注释掉的,有什么用,且听下回分解。
-
WEB-INF/web.xml,applicationContext.xml,log4j.properties配置相关参数Web.xml中配置加载WEB-INF/classes/applicationContext*.xml文件。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext*.xml</param-value>
</context-param>
配置spring-mvc.xml文件,配置使用注解方式:
<!-- 扫描controller(controller层注入) -->
<context:component-scan base-package="com.bigfish.bookstore.web"/>
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven />
log4j配置,省略。
-
applicationContex-drools.xml配置Drools相关包
<kie:kmodule id="bookstore-kmodule">
<kie:kbase name="bookprice_kbase" packages="rules.bookstore.price">
<kie:ksession name="bookprice_ksession" scope="prototype" />
</kie:kbase>
</kie:kmodule>
<context:component-scan base-package="com.bigfish"/>
<!-- <bean id="kiePostProcessor" class="org.kie.spring.KModuleBeanFactoryPostProcessor" /> -->
<bean id="kiePostProcessor"
class="org.kie.spring.annotations.KModuleAnnotationPostProcessor " />
说明:
1、kie:kmodule 替代了META-INF/kmodule.xml文件,此处配置kmoudle和kbase,ksession信息;
2、kie:kbase标签的packages属性定义了规则文件(比如drl,decision table等)的本地保存路径;
3、context:component-scan,配置是自动扫描对应目录的kie标注,并注入Spring上下文
4、 KModuleAnnotationPostProcessor是初始化Drools环境的必备处理器,采用标注方式,如果不采用标注,那么可以使用 KModuleBeanFactoryPostProcessor
-
编写Fact Object
创建Book Fact对象类,如下(省略get set方法):
public class Book implements Serializable {
private String name;
// 书的分类
private String clz;
// 销售区域
private String salesArea;
// 出版日期距今时间(单位:Y)
private int years;
// 报价
private double basePrice;
// 对外售价
private double salesPrice;
}
-
编写rules文件
在rules/bookstore/price目录中建立book_price.drl规则文件(此处注意,规则文件的路径对应applicationContext-drools.xml文件中的kbase的packages路径),内容如下:
package rules.bookstore.price;
import com.bigfish.bookstore.dto.Book;
dialect "mvel"
//默认售价为书的原价
rule "default book price rule"
lock-on-active
salience 10
when
$b : Book()
then
$b.salesPrice = $b.basePrice;
end
//计算机类图书打95折
rule "the clz of computer price rule 95% discount"
lock-on-active
salience 9
when
$b : Book( clz == "computer")
then
$b.salesPrice = $b.basePrice * 0.95;
end
//销售区域是中国的话,在优惠的基础上再减两块钱
rule "china area sales price rule"
salience 8
when
$b : Book( salesArea == "china" )
then
$b.salesPrice = $b.salesPrice - 2;
end
//如果书的出版时间超过2年的话,售价在原价的基础上打8折, 与计算机类图书优惠不能同时享受
rule "years 2+ rule"
salience 7
when
$b : Book( years > 2 && clz != "computer")
then
$b.salesPrice = $b.basePrice * 0.8;
end
-
编写BookService
利用Ksession标注完成Session对象的注入,KSession标注后面的字符串是在applicationContext-drools.xml中定义的Kiesession的Spring Bean Name。
package com.bigfish.bookstore.service;
import org.kie.api.cdi.KSession;
import org.kie.api.runtime.KieSession;
import org.springframework.stereotype.Service;
import com.bigfish.bookstore.dto.Book;
@Service
public class BookService {
@KSession("bookprice_ksession")
private KieSession kSession;
/**
* 获取一本书的当前实际售价
*
* @param b
* @return
*/
public double getBookSalePrice(Book b) {
if (b == null) {
throw new NullPointerException("Book can not be null.");
}
kSession.insert(b);
kSession.fireAllRules();
return b.getSalesPrice();
}
}
-
编写controller
忽略。
-
发布到tomcat,测试。
发布后,访问:http://localhost:8080/drools-quickstart/book/order
显示如下,表示Spring与Drools6规则引擎集成并且执行成功:
-
drools-quickstart源码下载
本文代码分享在码云的Git库中,供大家下载,下载地址:https://git.oschina.net/duanjunwei/drools-quickstart.git ,drools-quickstart就是这个例子的源码。