drools简单应用

  当某个服务的需求经常变的时候,如果使用了硬编码的方式进行开发会是一件非常麻烦的事。

  最近在对项目的积分模块进行改造的时候想到了规则引擎,使用规则引擎处理复杂而且多变的业务逻辑有其非常大的优势,包括实时更新、性能等方面。

不多说,直接上代码:

1、第一步先写好工具类,有了工具类,只需在应用的业务场景中调用相应方法就可以了

@Component
public class KieSessionUtils {private static KieBase kieBase;//定义规则文件的包名,与drl文件里的package对应private static final String drlPackage = "rules";//定义drl文件的存放路径,静态变量需要通过在其set方法上打@Value注解,才可实现配置注入private static String drlPath;//通过配置拉取路径,这里推荐一下apollo配置中心,使用apollo可以实时更改通过@Value拉取的配置@Value("${drools.points.drlPath}")public void setDrlPath(String drlPath){KieSessionUtils.drlPath = drlPath;}/***  生成kieSeesion会话* @param ruleName* @return* @throws Exception*/public static KieSession newKieSession(String ruleName) throws Exception {//无状态的kieSession,和有状态相比,区别在于不维持会话,即使用完后自动释放资源,不需要手动调dispose//StatelessKieSession kieSession = getKieBase(ruleName).newStatelessKieSession();//有状态的kieSessionKieSession kieSession = getKieBase(ruleName).newKieSession();//添加监听器,这里加的是对规则文件运行debug监听器,测试时最好加上,用于排查问题,生产上可视情况去掉kieSession.addEventListener(new DebugRuleRuntimeEventListener());return kieSession;}/***  生成kieBase* @param ruleName 规则文件名* @return* @throws Exception*/protected static KieBase getKieBase(String ruleName) throws Exception {//判断kieBase和需要获取的规则文件是否存在,不存在则重新初始化kieBaseif (kieBase ==null || kieBase.getRule(drlPackage,ruleName)==null) {KieServices kieServices = KieServices.Factory.get();KieFileSystem kfs = kieServices.newKieFileSystem();//获取规则数据源,这里由于本人项目使用的是springboot,打包会打成jar包,如果想做实时更新,drl文件需要放在jar包外面//获取resource的方式很多,不一定要用读取文件的方式,可根据自己的设计和业务场景采取不同方案Resource resource = kieServices.getResources().newFileSystemResource(new File(drlPath+"/"+ruleName));resource.setResourceType(ResourceType.DRL);kfs.write(resource);KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll();if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) {throw new Exception();}KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());kieBase = kieContainer.getKieBase();}return kieBase;}/*** 更新规则* @param ruleName 规则名和规则文件名* @throws Exception*/public static void refreshRules(String ruleName) throws Exception {//判断规则不为null,则移除规则if (kieBase !=null && kieBase.getRule(drlPackage,ruleName)!=null){//为了方便,本人把规则名和drl文件名称统一定义了
            kieBase.removeRule(drlPackage,ruleName);//重新初始化kieBase
            getKieBase(ruleName);}}
}

2、编写规则文件,这里只给出和规则引擎格式有关的代码

package rules;    //包名import com.jiuair.dto.AddObject
import java.util.List
import java.util.HashMap
import java.util.Map
import java.util.ArrayList
import java.util.Date
import java.util.Iterator
import java.util.Setglobal com.demo.dto.AddObject addObject    //传入的对象,同时也是返回值对象
rule "add.drl"    //规则名,为了方便,设为何drl文件名一样,可以不一样
        when$s : AddObject();then。。。。。//这一段加自己业务代码逻辑,支持jdk$s.setResult(X);    //执行完逻辑后将结果设置到对象中
end

3、在业务场景中调用工具类里的方法

private AddObject executeAddRule(Object data) {AddObject addObject = new AddObject();addObject.setJsonObject(data);try {//获取会话KieSession kieSession = KieSessionUtils.newKieSession("add.drl");//设置传入参数
            kieSession.insert(addObject);//设置全局参数kieSession.setGlobal("addObject",addObject);//执行规则
            kieSession.fireAllRules();//释放会话资源
            kieSession.dispose();} catch (Exception e) {e.printStackTrace();}return addObject;}

4、实现实时更新drl文件

   /*** 更新规则文件,这里只给出service层的代码了,相信controller大家都会写。。。* @param name  名称为drl的文件名* @param is    由于dubbo不支持流的方式传输,文件需在controller转为byte数组,再传到service*/@Overridepublic void refreshRule(String name, byte[] is) {try {FileOutputStream fos = new FileOutputStream(drlPath+"/"+name);fos.write(is);fos.close();KieSessionUtils.refreshRules(name);} catch (Exception e) {e.printStackTrace();}}

附maven引包:

<properties><runtime.version>7.20.0.Final</runtime.version></properties><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${runtime.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-internal</artifactId><version>${runtime.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${runtime.version}</version></dependency>  <dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${runtime.version}</version></dependency>

 

 

import java 详细X
没有英汉互译结果
  请尝试网页搜索

转载于:https://www.cnblogs.com/jagerLan/p/10857004.html

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

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

相关文章

31 天重构学习笔记28. 为布尔方法命名

摘要&#xff1a;由于最近在做重构的项目&#xff0c;所以对重构又重新进行了一遍学习和整理&#xff0c;对31天重构最早接触是在2009年 10月份&#xff0c;由于当时没有订阅Sean Chambers的blog&#xff0c;所以是在国外的社区上闲逛的时候链接过去的。记得当时一口气看完了整…

Matplotlib学习---用matplotlib画误差线(errorbar)

误差线用于显示数据的不确定程度&#xff0c;误差一般使用标准差&#xff08;Standard Deviation&#xff09;或标准误差&#xff08;Standard Error&#xff09;。 标准差&#xff08;SD&#xff09;&#xff1a;是方差的算术平方根。如果是总体标准差&#xff0c;那么用σ表示…

关于自增id 你可能还不知道

导读&#xff1a;在使用MySQL建表时&#xff0c;我们通常会创建一个自增字段(AUTO_INCREMENT)&#xff0c;并以此字段作为主键。本篇文章将以问答的形式讲述关于自增id的一切。 注&#xff1a; 本文所讲的都是基于Innodb存储引擎。 1.MySQL为什么建议将自增列id设为主键&#x…

Android One和Android Go有什么区别?

In 2014, Google announced a lineup of low-cost, low-spec phones called Android One. In 2017, they announced Android Go, specifically designed for low-cost, low-spec phones. So…what’s the difference? 2014年&#xff0c;Google宣布了一系列名为Android One的低…

outlook advanced find 快捷键不起作用

症状&#xff1a;用户反应按outlook advanced find的快捷键时无效&#xff0c;快捷键为CtrlShiftF。第一感觉是肯定跟别的软件有冲突了&#xff0c;观察了下&#xff0c;发现用户正在使用sougou拼音输入法&#xff0c;于是点其属性查看&#xff0c;果然发现与其的简繁切换冲突了…

vue1.0和vue2.0生命周期----整理一

## 1. 作用域区别   1.x 随意的定义作用域   2.x 不允许body 或者html 元素 ## 2. 生命周期   1.x:     created 实例已经创建     beforeCompile 在编译之前     compiled 编译之后     ready 实例已经插入到文档之中     beforeDetroy 在销毁之前 …

21-while里的break简单用法

break是结束循环&#xff0c;break之后、循环体内代码不再执行。 while True:yn input(Continue(y/n): )if yn in [n,N]:breakprint(running......) 结果输出&#xff1a; 转载于:https://www.cnblogs.com/hejianping/p/10861816.html

视频造假_如何发现“深造假”面部切换视频

视频造假Recently, Reddit has been making news again with a subreddit in w hich people use a machine learning tool called “Deep Fake” to automatically replace one person’s face with another in a video. Obviously, since this is the internet, people are us…

C#实现MD5加密

C#实现MD5加密。 1、创建MD5Str.cs加密处理类 [csharp] view plaincopy public class MD5Str { /// <summary> /// 字符串MD5加密 /// </summary> /// <param name"Text">要加密的字符串</param> /// <returns…

【agc004f】Namori Grundy

那个问一下有人可以解释以下这个做法嘛&#xff0c;看不太懂QwQ~ Description 有一个n个点n条边的有向图&#xff0c;点的编号为从1到n。 给出一个数组p&#xff0c;表明有&#xff08;p1&#xff0c;1&#xff09;&#xff0c;&#xff08;p2&#xff0c;2&#xff09;&#x…

找到特定ip地址 修改ip_您如何找到网站的IP地址?

找到特定ip地址 修改ipWhether you are in it just for a bit of geeky fun, or are seriously wanting to know the answer, how do you find out the IP address for a website? Today’s SuperUser Q&A post looks at the answer, and how to know if more than one we…

Rational Rose 2003 下载、破解及安装方法(图文)

方法一&#xff1a; 1、安装Rational Rose2003时&#xff0c;在需选择安装项的时候&#xff0c;只选择Rational Rose EnterPrise Edition即可&#xff0c;不需选择其他项&#xff0c;之后选择“DeskTop Installation from CD Image“&#xff0c;一路下一步。出现Mem_pointer_B…

数据结构:莫队

莫队算法是用来处理一类无修改的离线区间询问问题 莫队的精髓就在于&#xff0c;离线得到了一堆需要处理的区间后&#xff0c;合理的安排这些区间计算的次序以得到一个较优的复杂度 代表题目是BZOJ2038这道题 进行区间询问[l,r]&#xff0c;输出该区间内随机抽两次抽到相同颜色…

【学习笔记】第三章 python3核心技术与实践--Jupyter Notebook

可能你已经知道&#xff0c;Python 在 14 年后的“崛起”&#xff0c;得益于机器学习和数学统计应用的兴起。那为什么 Python 如此适合数学统计和机器学习呢&#xff1f;作为“老司机”的我可以肯定地告诉你&#xff0c;Jupyter Notebook &#xff08;https://jupyter.org/&…

二进制安位处理_处理器与安​​全性之间的联系是什么?

二进制安位处理Newer processors are able to contribute to the security of your system, but what exactly do they do to help? Today’s Super User Q&A post looks at the link between processors and system security. 较新的处理器能够为您的系统安全做出贡献&am…

李开复现身说法成功的十个启发

http://blog.sina.com.cn/kaifulee自信不失谦虚&#xff0c;谦虚不失自信天赋就是兴趣 兴趣就是天赋思考比传道重要 观点比解惑重要我不同意你 但我支持你挫折不是惩罚 而是学习的机会创新不重要 有用的创新才重要完美的工作 成长兴趣 影响力用勇气改变可以改变的事情做最好的领…

关于width: 100%的一些看法

一.position对width 设置为百分比的影响<html><head><style type"text/css">img {width: 50%}body {margin: 8px;}</style> </head><body><div style" min-height: 10px; background: red; "><div><im…

Haproxy+多台MySQL从服务器(Slave) 实现负载均衡

本系统采用MySQL一主多从模式设计&#xff0c;即1台 MySQL“主”服务器(Master)多台“从”服务器(Slave)&#xff0c;“从”服务器之间通过Haproxy进行负载均衡&#xff0c;对外只提供一个访问IP&#xff0c;当程序需要访问多台"从"服务器时&#xff0c;只需要访问Ha…

爱普生第三方相机_值得购买第三方相机镜头吗?

爱普生第三方相机When people buy a Canon or Nikon camera, they often assume that they can only buy Canon or Nikon lenses. But that isn’t true. While Nikon lenses won’t work on your Canon camera, there are third-party lens manufacturers—such as Sigma, Tam…

[BZOJ4182]Shopping

description 权限题。 树上\(n\)个节点每个节点都有一种物品&#xff0c;每种物品有其价值&#xff0c;价格&#xff0c;数量&#xff0c;只能买一个连通块中的物品&#xff0c;求\(m\)元能买到物品价值的最大值。 data range \[ n\le 500,m\le 4000,T\le 5,c_i\le m\] solutio…