Drools 6.5 Final学习笔记

最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Drools这个开源引擎,发现其功能强大到超出我的预期。

什么是Drools?它是由大名鼎鼎的JBoss公司开源的规则引擎系统,可以免费下载使用,现在已经发展到6.5版本,并且7.0RC版也已经可以下载使用了。它可以集成在JavaEE项目中进行使用,其下载地址如下:https://www.drools.org/download/download.html,进入下载地址后下载Drools Engine和Drools and jBPM tools连个压缩包在Eclipse中做好相应的配置后就可以进行开发了。

Eclipse开发环境的搭建,将Drools and JBPM tools压缩包解压后将目录\binaries\org.drools.updatesite目录中的plagins和features两个子目录copy到Eclipse的各目录下,这两个子目录中的内容会和Eclipse中对应的子目录中的内容合并,然后启动Eclipse,打开Window菜单下Preferences,会发现多了Drools项,然后对Drools进行配置,如下图:

再选择Drools Runtime将Drools Engine压缩包解压后的jar文件填加进去,如下图:

点击OK后,选择已经填加的Runtime,如下图:

做好这些配置后,重启Eclipse。然后新建项目,会发现项目类型中多了Drools类型,选择Drools Project,Next。

选择第二项,创建示例项目。

进入项目后项目结构如下:

其中com.sample中是针对三种规则文件的测试类,resources目录下对应三种规则定义文件,分别是Excel,drl和bpmn文件,kmodule.xml中存储的kbase和kession的描述,描述如下:

<?xml version="1.0" encoding="UTF-8"?>

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">

<kbase name="rules" packages="rules">

<ksession name="ksession-rules"/>

</kbase>

<kbase name="dtables" packages="dtables">

<ksession name="ksession-dtables"/>

</kbase>

<kbase name="process" packages="process">

<ksession name="ksession-process"/>

</kbase>

</kmodule>

其中kbase的packages必须和项目中的报名一致,ksession的名字会在代码中用到,我们以drl规则文件为例看一下其怎么发挥作用的,drl规则文件对应的测试代码为DroolsTest,其规则文件定义如下:

package com.sample

import com.sample.Message;

rule "Hello World"

when

m : Message( status == Message.HELLO, myMessage : message )

then

System.out.println( myMessage );

m.setMessage( "Goodbye cruel world" );

m.setStatus( Message.GOODBYE );

update( m );

end

rule "GoodBye"

when

Message( status == Message.GOODBYE, myMessage : message )

then

System.out.println( myMessage );

end

其中package为自已定义的一段文字可以与代码中的不同,使用import引入需要进行规则验证的对象类型,Eclipse生成的代码是一个static类,其实可以是一个普通类,这里我们使用的对象类型为com.sample.Message,其中定义了两条规则分别为Hello World和GoodBye,其使用when 和then作为if then的表达(即如果怎样就怎样),其中rule "Hello World"中,在when短语中定义了一个Message对象m和获取Message属性message的myMessage变量,then语句总使用Message类中的方法对m对象的属性进行了更新,并使用update(m)的方式更新回了Java代码中,整个when的意思是对传入的Message对象m进行如下判断如果m.status==Message.HELLO,则执行then中的操作。

DroolsTest.java代码如下,main方法中前三行则是为了构造Kie对象,取得了kmodule.xml中名字为ksession-rules的session,通过kSession.insert(msg)传入需要进行规则验证的对象,通过kSession.fireAllRules()执行规则。

package com.sample;

import java.util.ArrayList;

import java.util.List;

import org.kie.api.KieServices;

import org.kie.api.runtime.KieContainer;

import org.kie.api.runtime.KieSession;

public class DroolsTest {

public static final void main(String[] args) {

try {

// load up the knowledge base

KieServices ks = KieServices.Factory.get();

KieContainer kContainer = ks.getKieClasspathContainer();

KieSession kSession = kContainer.newKieSession("ksession-rules");

// go !

Message message = new Message();

message.setMessage("Hello World");

message.setStatus(Message.HELLO);

System.out.println(String.format("执行规则前message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));

Message message2=new Message();

message2.setMessage("liuyinghui");

message2.setStatus(Message.HELLO);

List<Message> listMsg= new ArrayList<Message>();

listMsg.add(message2);

listMsg.add(message);

for (Message msg : listMsg) {

kSession.insert(msg);

kSession.fireAllRules();

}

System.out.println(String.format("执行规则后message对象的变化如下:message.message=%s,message.status=%d", message.getMessage(),message.getStatus()));

} catch (Throwable t) {

t.printStackTrace();

}

}

}

Message.java的定义如下:

package com.sample;

public class Message {

public static final int HELLO = 0;

public static final int GOODBYE = 1;

private String message;

private int status;

public String getMessage() {

return this.message;

}

public void setMessage(String message) {

this.message = message;

}

public int getStatus() {

return this.status;

}

public void setStatus(int status) {

this.status = status;

}

}

运行结果如下图,可以看到经过规则引擎的处理前后后message对象的变化,中间测试规则文件执行时输出的一些属性值,至此一个简单的使用Drools规则引擎的程序就开发完毕了。

Drools 6.5 Final 入门的更多相关文章

  1. Java面向对象之关键字final 入门实例

    一.基础概念 1.关键字final可以修饰类.函数.变量. 2.关键字final修饰的类不可以被继承. 3.关键字final修饰的方法不可以被覆盖. 4.关键字final修饰的变量是一个常量,只能被赋 ...

  2. Drool实战系列(一)之入门程序

    Drools官网地址为:https://www.drools.org/ maven环境 入门程序例子如下: 项目结构截图: 一.导入pom文件 <project xmlns="http ...

  3. Drools介绍与使用

    Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法对所编写的规则求值.Drools 允许使用声明方式表达业务逻辑.可以使用非 XML 的本地语言编写规则,从而便于学习和理解 ...

  4. jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

    前言 目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5 ...

  5. Drools 7.4.1.Final参考手册(六) 用户手册

    用户手册 基础 无状态的知识Session Drools规则引擎拥有大量的用例和功能,我们要如何开始?你无须担心,这些复杂性是分层的,你可以用简单的用例来逐步入门. 无状态Session,无须使用推理 ...

  6. drools的简单入门案例

    一.背景 最近在学习规则引擎drools,此处简单记录一下drools的入门案例. 二.为什么要学习drools 假设我们存在如下场景: 在我们到商店购买衣服的时候,经常会发生这样的事情,购买1件不打 ...

  7. jboss规则引擎KIE Drools 6.3.0 Final 教程(2)

    使用JAVA程序调用规则-运行KIE-DROOLS上的规则 第一步:建立一个MAVEN的Java工程 POM.XML 给出pom.xml文件 <project xmlns="http: ...

  8. drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)

    最近研究了一下规则引擎drools. 这篇博客带你搭建并运行一个可在线编辑,在线打包,远程执行的规则引擎(drools) 本篇博客同时参考https://blog.csdn.net/chinrui/a ...

  9. Drools规则引擎入门指南(三)——使用Docker部署Workbench

    其实本来我也是打算使用Tomcat来部署Workbench的,但是在网上看了几篇文章,超级繁琐的配置.各种版本.实在看不下去了索性就直接使用Docker来部署了.本次部署的版本是最新稳定版,对应dro ...

随机推荐

  1. JS学习中遇到的一些题目

    1.找出所有的水仙花数: 水仙花数例如:153 的特点: 1^3+5^3+3^=153 而且水仙花数只会是三位数,所以可以利用循环的方式来解决问题,循环条件可以设为: var i = 1;i < ...

  2. 在IntelliJ IDEA中添加repository模板

    可以用于快速新建一个repository类,减少开发时间 在IntelliJ IDEA settings设置中(ctrl+alt+s)--Editor--File and Code Templates ...

  3. USACO Section 1.1-3 Friday the Thirteenth

    Friday the Thirteenth 黑色星期五 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数. 给出N年的一个 ...

  4. 如何精准高效的实现视觉稿?------前端开发辅助工具AlloyDesigner使用介绍

    AlloyDesigner:http://alloyteam.github.io/AlloyDesigner/ 介绍:AlloyDesigner是腾讯开发的一款工具,其在页面构建过程中,直接嵌入开发的 ...

  5. JavaEE开发之SpringMVC中的路由配置及参数传递详解

    在之前我们使用Swift的Perfect框架来开发服务端程序时,聊到了Perfect中的路由配置.而在SpringMVC中的路由配置与其也是大同小异的.说到路由,其实就是将URL映射到Java的具体类 ...

  6. android-studio-bundle-141.2178183首次执行Hello World的时候出现ADB not responding. If you'd like to retry, then please manually kill "adb.e的错误

    这是由于有其他程序在占用adb.exe要使用的端口5037,打开命令提示符cmd,输入指令netstat -aon|findstr 5037查看在使用此端口的程序,如 8036即为占用该端口号的PID ...

  7. IOS——触摸事件 视图检测和事件传递

    iPhone上有非常流畅的用户触摸交互体验,能检测各种手势:点击,滑动,放大缩小,旋转.大多数情况都是用UI*GestureRecognizer这样的手势对象来关联手势事件和手势处理函数.也有时候,会 ...

  8. redis 链表

    redis 链表 前言 借鉴了 黄健宏 的 <<Redis 设计与实现>> 一书, 对 redis 源码进行学习 欢迎大家给予意见, 互相沟通学习 概述 redis 的链表结构 ...

  9. 【caffe-windows】 caffe-master 之 训练自己数据集(图片转换成lmdb or leveldb)

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签  ...

  10. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...