规则引擎drools的简单使用

规则引擎适用于有复杂多变的规则,如商品满减、积分赠送、考勤规则等

一、引入maven依赖

<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.13.0.Final</version>
</dependency>
<dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>7.13.0.Final</version>
</dependency>

  

二、drools有两种执行方式,第一种是基于kmodule.xml、drl配置文件,第二种是动态读取规则

基于kmodule方式

 1)创建Fact,drools中的Fact即是java中的普通的bean,用于传递参数

package com.beyond.odc.entity;/*** Fact java bean* @author Hejinsheng*/
public class Message {private String message;private String result;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;}public String getResult() {return result;}public void setResult(String result) {this.result = result;}
}

  

 2)在resources/META-INF下创建kmodule.xml文件,内容如下

<?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>
</kmodule>

  

3)在resources/rules文件夹下创建规则描述文件rules.drl,内容如下

package rulesimport com.beyond.odc.entity.Message;rule "hello"no-loop truelock-on-active truewhen$message:Message(status==0)thenSystem.out.println("消息:"+$message.getMessage());$message.setResult("hello 响应的消息");update($message)
endrule "byebye"no-loop truelock-on-active truewhen$message:Message(status==1)thenSystem.out.println("消息:"+$message.getMessage());$message.setResult("byebye 响应的消息");update($message)
end

  

 4)编写测试文件

public static void main(String[] args) {try {KieSession kSession = KieContainerFactory.getKieContainer().newKieSession("ksession-rules");Message message = new Message();message.setMessage("hello");    // 对应drl文件中的rule name,表示要执行的规则message.setStatus(0);           // 取message中的某个字段,用户规则文件中的判断是否执行代码块kSession.insert(message);       // 将message作为传递的参数传入drools执行kSession.fireAllRules();        // 加载规则System.out.println("从drools中接收到的消息:"+message.getResult());    // drools中如果有参数响应,可以通过字段获取} catch (Throwable t) {t.printStackTrace();}
}

  

//KieContainerFactory代码片段
public class KieContainerFactory {private static KieContainer kieContainer;public static KieContainer getKieContainer() {if(kieContainer == null){// load up the knowledge baseKieServices ks = KieServices.Factory.get();KieContainer kContainer = ks.getKieClasspathContainer();kieContainer = kContainer;}return kieContainer;}
}

  

5)执行结果,说明代码已经执行到drools文件中,具体的业务逻辑可以在then后的代码块中实现

进来了,消息:hello
从drools中接收到的消息:hello 响应的消息

  

三、动态方式执行

一般指从数据库或者远程获取的规则描述信息,进行规则执行。动态方式不需要kmodule.xml和drl文件,执行上更加简单

public static void execFromDB(){KieSession kSession = null;try {// 实际情况从数据库根据code查规则,这里模拟写死String rule = "package rules\n" +"\n" +"import com.beyond.odc.entity.Message;\n" +"\n" +"rule \"hello\"\n" +"    no-loop true\n" +"    lock-on-active true\n" +"    when\n" +"        $message:Message(status==0)\n" +"    then\n" +"        System.out.println(\"动态执行,消息:\"+$message.getMessage());\n" +"        $message.setResult(\"hello 响应的消息\");\n" +"        update($message)\n" +"end\n" +"\n" +"rule \"byebye\"\n" +"    no-loop true\n" +"    lock-on-active true\n" +"    when\n" +"        $message:Message(status==1)\n" +"    then\n" +"        System.out.println(\"动态执行,消息:\"+$message.getMessage());\n" +"        $message.setResult(\"byebye 响应的消息\");\n" +"        update($message)\n" +"end";KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();kb.add(ResourceFactory.newByteArrayResource(rule.getBytes("utf-8")), ResourceType.DRL);// 检查规则正确性KnowledgeBuilderErrors errors = kb.getErrors();for (KnowledgeBuilderError error : errors) {System.out.println("规则文件正确性有误:{}" + error);}InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();kBase.addPackages(kb.getKnowledgePackages());// 执行规则kSession = kBase.newKieSession();// factMessage fact = new Message();fact.setMessage("byebye");fact.setStatus(1);kSession.insert(fact);kSession.fireAllRules();System.out.println("从drools规则中接收到的消息:"+fact.getResult());} catch (Exception e) {System.out.println("规则执行异常:{}"+e);} finally {if (null != kSession)kSession.dispose();}}

  执行结果如下:

动态执行,消息:byebye
从drools规则中接收到的消息:byebye 响应的消息

  

 

转载于:https://www.cnblogs.com/half-two-feet/p/9876684.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用MongoDB进行乐观锁定重试

在我以前的文章中&#xff0c;我谈到了对MongoDB批处理程序采用乐观锁定的好处。 如我之前所写&#xff0c;乐观锁异常是可恢复的异常&#xff0c;只要我们获取最新的Entity&#xff0c;我们就会对其进行更新并保存。 因为我们使用的是MongoDB&#xff0c;所以我们不必担心本地…

cx oracle 配置,cx_Oracle的配置啊。。终于搞出来了

参考。。http://www.blogjava.net/jelver/articles/294583.htmlhttp://shanchao7932297.blog.163.com/blog/static/1363624200710911543428/http://aofengblog.blog.163.com/blog/static/6317021201157111336764/http://www.cnblogs.com/ysisl/archive/2010/12/20/1911870.html…

JavaScript中发布/订阅模式的理解

订阅发布模式的介绍 发布订阅模式&#xff0c;它定义了一种一对多的关系&#xff0c;可以使多个观察者对象对一个主题对象进行监听&#xff0c;当这个主题对象发生改变时&#xff0c;依赖的所有对象都会被通知到。 在生活中我们常常遇到这样一种情况&#xff0c;我们在使用新…

java的list遍历

for(String str : list) {//增强for循环&#xff0c;其内部实质上还是调用了迭代器遍历方式&#xff0c;这种循环方式还有其他限制&#xff0c;不建议使用。System.out.println(str); } for( int i 0 ; i < list.size() ; i) {//普通for循环&#xff0c;内部不锁定&#xf…

Spring Data Solr入门

Spring Data Solr是Spring Data项目的扩展&#xff0c;该项目旨在简化Apache Solr在Spring应用程序中的使用。 请注意&#xff0c;这不是Spring&#xff08;数据&#xff09;或Solr的简介。 我认为您至少对这两种技术都有一些基本的了解。 在下面的文章中&#xff0c;我将展示如…

一个关于fixed抖动的小bug

前言 大家都知道position: fixed用于生成绝对定位的元素&#xff0c;相对于浏览器窗口进行定位。 元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定。 突然发现自己之前写的网页有个小bug&#xff1a;在购买页面的…

BBS论坛(十八)

18.首页轮播图实现 &#xff08;1&#xff09;front/css/front_base.css .main-container{width: 990px;margin: 0 auto;overflow: hidden; } .lg-container{width: 730px;float:left; } .sm-container{width: 250px;float:right; } &#xff08;2&#xff09;front_base.html …

eureka-7-多网卡下的ip选择

目前没有需求,后面需要的话&#xff0c;再补充 只是简单使用的话&#xff0c;只需要指定ip即可 eureka.instance.ip-address:127.0.0.1转载于:https://www.cnblogs.com/wenq001/p/9884591.html

Java DB中的Java用户定义类型(UDT)

Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 用户定义类型&#xff08;UDT&#xff09;是Java类&#xff0c;其实例&#xff08;对象&#xff09;存储在数据库表列中。 UDT定义为…

php 字符串与数字相加,注意!PHP中字符串与数字的比较

在日常开发过程中&#xff0c; 运算符是我们每天都会接触到的。这个运算符中其实埋了非常多的坑&#xff0c;今天我们就来看下字符串和数字用比较需要注意的问题。首先来看看这些代码&#xff1a;echo "1234" " 1234" is . (1234 1234), PHP_EOL;echo …

腾讯Node.js基础设施TSW正式开源

经过六年的迭代与沉淀&#xff0c;腾讯Tencent Server Web (以下简称TSW)这一公司级运维组件于今日正式开源。TSW是面向WEB前端开发者&#xff0c;以提升问题定位效率为初衷&#xff0c;提供云抓包、全息日志和异常发现的Node.js基础设施。TSW每天为百亿次请求提供稳定服务&…

Luogu P1535 【游荡的奶牛】

搜索不知道为什么没有人写bfs觉得挺像是标准个bfs的 状态因为要统计次数&#xff0c;不能简单地跳过一个被经过的点这样的话&#xff0c;状态量会爆炸采用记忆化设dp[i][j][k]表示在第k分钟到达点(i,j)的方案数以地点时间作为状态避免同一状态被反复拓展这样&#xff0c;状态量…

ORM框架greenDao 2 (用于了解旧版本的使用方法,目前最新版本为3.2.2,使用注释的方式来生成)...

摘要&#xff1a; Android中对SQLite数据库使用&#xff0c;是一件非常频繁的事情。现今&#xff0c;也有非常多的SQLite处理的开源框架&#xff0c;其中最著名的greenDao&#xff0c;它以占用资源少&#xff0c;处理效率高等特点&#xff0c;成为优秀的ORM框架之一。那么对于g…

配置MySQL以进行ADF开发

大家好。 今天&#xff0c;我将向您展示如何为Oracle ADF开发配置MySQL数据库。 恕我直言&#xff0c;当您将ADF与其他数据库而不是Oracle DB一起使用时&#xff0c;您将无法使用Oracle ADF的全部功能&#xff0c;有时您会发现自己正在寻找解决方法&#xff0c;以实现某些行为…

linux 强行杀死进程,Linux如何查看进程、杀死进程、启动进程等常用命令

查进程杀进程使用kill命令结束进程&#xff1a;常用&#xff1a;Linux下还提供了一个killall命令&#xff0c;可以直接使用进程的名字而不是进程标识号&#xff0c;例如&#xff1a;进入到进程的执行文件所在的路径下&#xff0c;执行文件 ./文件名附&#xff1a;修改文件日期命…

React Native面试知识点

本文原创首发于公众号&#xff1a;ReactNative开发圈&#xff0c;转载需注明出处。 本文会不定期不断更新&#xff0c;想查看最新版本请移步至https://github.com/forrest23/react-native-interview 1.React Native相对于原生的ios和Android有哪些优势&#xff1f; 1.性能媲美…

KIE-WB / JBPM控制台Ng –配置

大家好&#xff0c;这是我上一篇文章中有关如何使用jBPM Console的后续文章 。 这篇文章的主要思想是描述为了在您自己的公司中使用它&#xff0c;您需要对jBPM Console NG进行一些最常见的配置。 但是在讨论技术细节之前&#xff0c;我们将介绍KIE Workbench&#xff08;KIE-W…

EasyUI常用控件禁用方法

来自&#xff1a;http://blog.csdn.net/jin_guang/article/details/36905387 特此感谢 1.validatebox可以用的用法:前两种适用于单个的validatebox; 第三种应用于整个form里面的输入框; <1>.$("#id").attr("readonly", true); ----- $("#id…

linux内核percpu变量声明,Linux kernel percpu变量解析

Linux 2.6 kernel 中的 percpu 变量是经常用到的东西&#xff0c;因为现在很多计算机都已经支持多处理器了&#xff0c;而且 kernel 默认都会被编译成 SMP 的&#xff0c;相对于原来多个处理器共享数据并进行处理的方式&#xff0c;用 percpu 变量在 SMP、NUMA 等架构下可以提高…

django组件 分页器

1 from django.shortcuts import render,HttpResponse2 3 # Create your views here.4 from app01.models import *5 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger6 7 def index(request):8 9 10 批量导入数据: 11 12 Booklist[] …