Spring与Drools6集成

  • 在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();
}
}
  1.  
  • 编写controller

忽略。

  • 发布到tomcat,测试。

发布后,访问:http://localhost:8080/drools-quickstart/book/order

显示如下,表示Spring与Drools6规则引擎集成并且执行成功:

  • drools-quickstart源码下载

本文代码分享在码云的Git库中,供大家下载,下载地址:https://git.oschina.net/duanjunwei/drools-quickstart.git ,drools-quickstart就是这个例子的源码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值