Drools应用实例
Drools 实例介绍
- Drools编译与运行:
在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译、规则收集和规则的执行。
- Kmodule.xml的编写
- kmodule.xml文件放到
src/main/resources/META-INF/文件夹下
- 代码的实现(具体内容)
<?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>
</kmodule>- 一个kmodule里面包含了两个kbase,这个也是我们这个例子里面的两个用例
分别对应drl规则文件的例子,一个是对应Excel表格的规则例子。每一个kbase都有一个name,可以取任意字符串,但是不能重名。
然后都有一个packages,可以看到packages里面的字符串其实就是src/main/resources下面的文件夹的名称,或者叫包名,规则引擎会根据这里定义的包来查找规则定义文件。可以同时定义多个包,以逗号分隔开来就行。每一个kbase下面可以包含多个ksession,当然本例中都自定义了一个。
每一个ksession都有一个name,名字也可以是任意字符串,但是也不能重复。
kbase和ksession里面的name属性是全局不能重复的。kbase和ksession中其实还有很多其它的属性,每一个kbase下面可以包含多个ksession。
在运行时,KieContainer会根据*Model对象来创建KieModule、KieBase、KieSession对象。其中KieModule和KieBase只会创建一次,而KieSession则有可能创建多次,因为KieSession的创建成本很低,同时KieSession包含了运行时的数据,所以可以销毁、创建若干次。
- kmodule.xml文件放到
- Drools运行测试
- 定义一个POJO类
package com.drool.test; public class Person {
private String name;
private int age;
private String desc; public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String toString()
{
return "[name="+name+",age="+age+",desc="+desc+"]";
}
}- 编辑配置文件
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<!-- packages ='表示drl 文件所在位置' -->
<kbase name="SimpleRuleKBase" packages="com.drool.test">
<! --kession name='表示 被引用的规则名'-->
<ksession name="simpleRuleKSession" default="true"/>
</kbase>
</kmodule>- 编辑规则:
person.drl
package com.person;<! -- 这里的包路径可以不并写到相应的位置 --> import com.drool.test.Person;<!-- 这里引用的POJO必须是正确的 -- > rule "boy" <! -- 规则名 -->
salience 1 <!-- 优先级, 值越大,优先级越高 -->
when
$p : Person(age > 0);
then
$p.setDesc("少年");
retract($p);
end rule "youth"
salience 2
when
$p : Person(age > 12);
then
$p.setDesc("青年");
retract($p);
end rule "midlife"
salience 3
when
$p : Person(age > 24);
then
$p.setDesc("中年");
retract($p);
end rule "old"
salience 4
when
$p : Person(age > 60);
then
$p.setDesc("老年");
retract($p);
end- 测试类
package com.drool.test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession; public class Test
{
static KieSession getSession()
{
KieServices ks = KieServices.Factory.get(); KieContainer kc = ks.getKieClasspathContainer(); return kc.newKieSession("simpleRuleKSession");
}
public static void main(String[] args)
{
KieSession ks = getSession();// Person p1 = new Person("白展堂", 68);
Person p2 = new Person("李大嘴", 32);
Person p3 = new Person("佟湘玉", 18);
Person p4 = new Person("郭芙蓉", 8); System.out.println("before p1 : " + p1);
System.out.println("before p2 : " + p2);
System.out.println("before p3 : " + p3);
System.out.println("before p4 : " + p4); ks.insert(p1);
ks.insert(p2);
ks.insert(p3);
ks.insert(p4); int count = ks.fireAllRules();
System.out.println("总执行了"+count+"条规则");
System.out.println("after p1 : " + p1);
System.out.println("after p2 : " + p2);
System.out.println("after p3 : " + p3);
System.out.println("after p4 : " + p4);
ks.dispose();
}
}- 输出结果
从classpath中读取kmodule,创建KieContainder容器,利用kieContainer对象创建一个新的KieSession,创建session的时候我们传入了一个name:"simpleRuleKSession”,这个字符串很眼熟吧,这个就是我们定义的kmodule.xml文件中定义的ksession的name。
kieContainer根据kmodule.xml定义的ksession的名称找到KieSession的定义,然后创建一个KieSession的实例。
KieSession就是一个到规则引擎的链接,通过它就可以跟规则引擎通讯,并且发起执行规则的操作。
通过kSession.insert方法来将事实(Fact)插入到引擎中,也就是Working Memory中。
然后通过kSession.fireAllRules方法来通知规则引擎执行规则。
Drools应用实例的更多相关文章
- JAVA规则引擎 -- Drools
Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...
- [Drools]JAVA规则引擎 -- Drools
Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...
- [Drools]JAVA规则引擎 -- Drools- 转http://blog.csdn.net/quzishen/article/details/6163012
[Drools]JAVA规则引擎 -- Drools 标签: java引擎exceptiongetterstringsetter 2011-01-25 14:33 113340人阅读 评论(35) 收 ...
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- Drools规则引擎详解-常用的drl实例
package droolsDemo //说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致, //主要用于可以根据kmodule.xml中不同的 ...
- [Drools]JAVA规则引擎 -- Drools 2
上一篇文章 http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的 ...
- Drools文档(六) 用户手册
用户手册 基础 无状态的知识Session Drools规则引擎拥有大量的用例和功能,我们要如何开始?你无须担心,这些复杂性是分层的,你可以用简单的用例来逐步入门. 无状态Session,无须使用推理 ...
- Drools文档(八) 规则语言参考
规则语言参考 概述 Drools有一个"本地"的规则语言.这种格式在标点符号上非常轻,并且通过"扩展器"支持自然语言和领域特定的语言,使语言能够变形到您的问题领 ...
- Drools(BRMS) 速成教程(上)
大家在日常开发中,肯定遇到过一些业务规则变来变去的需求,比如:会员积分系统(今天要新注册会员送10积分,明天要改成注册送优惠券,后天搞活动要改成注册自动变成高级会员...),此类需求,一般都是通过写i ...
随机推荐
- docker 学习(六) export/import/load/save images
export/import 是一对命令: load/save是一对命令 一: export / import使用 1: 查看镜像: docker ps -a 2:导出镜像:docker ex ...
- SQL repeat()函数
转自:https://www.yiibai.com/sql/sql-repeat-function.html REPEAT(str,count) 返回一个字符串组成的字符串STR重复的次数.如果计数小 ...
- centos时区
执行:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime是将shanghai时区设置为系统时区 执行:date +%s 获取的是系统的utc时间戳 ...
- 基于粒子群优化的无约束50维Rosenbrock函数求解
基于粒子群优化的无约束50维Rosenbrock函数求解 一.问题重述 无约束50维的Rosenbrock函数可以描述如下: 其中, 0 要求按PSO算法思想设计一个该问题的求解算法. Rosenbr ...
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bireportSqlSessionFactory' defined in URL
报错如下: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'birepo ...
- 20个Flutter实例视频教程-第08节: 保持页面状态
博客地址: https://jspang.com/post/flutterDemo.html#toc-bb9 视频地址: https://www.bilibili.com/video/av397092 ...
- Flutter实战视频-移动电商-40.路由_Fluro的全局注入和使用方法
40.路由_Fluro的全局注入和使用方法 路由注册到顶层,使每个页面都可以使用,注册到顶层就需要在main.dart中 main.dart注册路由 注入 onGenerateRoute是Materi ...
- Flutter实战视频-移动电商-62.购物车_首页Provide化 让跳转随心所欲
62.购物车_首页Provide化 让跳转随心所欲 新建provide/currentIndex.dart 内容比较简单,定义一个变量当前页面的索引currentIndex,再定义一个方法改变它的值 ...
- javascript runat server
<script runat="server"> protected void SubmitBtn_Click(object sender, EventArgs e) { ...
- 让webStorm支持自动监听编译scss文件
前提概要 今日,重装了两波系统,,,之前安装的各种环境都忘光了,重新又踩一次坑的感觉很不舒服,所以记录一下配置自动编译scss一路遇到的坑 一.webstrom run的时候控制台输出的错误中文提示乱 ...