https://www.jianshu.com/p/725811f420db

深入了解Drools

简单介绍

笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || age > 50 -> REJECT )。最便捷的实现就是用 if-else 来写,但是随着规则的增加以及需求的变动,代码将变得越来越难阅读和变动。这时候就要引入Drools等规则引擎了。Drools就是为了解决业务代码和业务规则分离的引擎。

开发环境搭建

网上一般都是eclipse下的教程,这里讲下intellij下的教程。

  • 安装JBoss Drools Support插件。主要是为了intellij可以识别drools文件,使用快捷的智能提示。
  • 下载依赖jar (https://download.jboss.org/drools/release/7.3.0.Final/droolsjbpm-tools-distribution-7.3.0.Final.zip)

好了,就这么点步骤,就是如此简单。

Hello Drools

下面立马上手Hello Drools。实现需求:判断一个人的 age < 16 || age > 50 的时候,打印年龄不符合要求。

  • 建立工程
     就是典型的maven工程,除外需要做以下事情:
  1. 导入drools有关jar包。就是droolsjbpm-tools-distribution-7.3.0.Final.zip解压出来后的binaries下的jar包。
  2. 新建配置文件/src/resources/META-INF/kmodule.xml
  3. 新建drools规则文件/src/resources/rules/age.drl
    工程搭建完毕,效果如图:

 
  • 开始编写代码
  • kmodule.xml
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<kbase name="specialerrorDrl" packages="rules">
<ksession name="spacialerrorSession"/>
</kbase>
</kmodule>

packages:指定drl文件的目录

  

SpecialErrorHandle.java
其中flag,用来判断解析后传进来的text,与需要对比的数据是否相等
public boolean flag() {
return StringUtils.equals(text, StringUtils.deleteWhitespace(equalStr));
}
public class SpecialErrorHandle {

    /**解析text*/
private String text; /**对比的数据**/
private String equalStr; /**返回错误码**/
private String code; /**提示数据**/
private String tips; private boolean flag; public SpecialErrorHandle(String text, String equalStr, String tips){
this.text = text;
this.equalStr = equalStr;
this.tips = tips;
} public SpecialErrorHandle(String text, String equalStr, String code, String tips){
this.text = text;
this.equalStr = equalStr;
this.code = code;
this.tips = tips;
} public String getText() {
return text;
} public void setText(String text) {
this.text = text;
} public String getEqualStr() {
return equalStr;
} public void setEqualStr(String equalStr) {
this.equalStr = equalStr;
} public String getTips() {
return tips;
} public void setTips(String tips) {
this.tips = tips;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public boolean flag() {
return StringUtils.equals(text, StringUtils.deleteWhitespace(equalStr));
} public void setFlag(boolean flag) {
this.flag = flag;
} }

  

规则库drl文件:specialErrorHandle.drl

import common.tribe.error.SpecialErrorHandle;
import common.exception.ServiceException; rule "specialErrorHandl"
when
$specialErrorHandle : SpecialErrorHandle(flag == true)
then
throw new ServiceException($specialErrorHandle.getTips(), $specialErrorHandle.getCode());
end

  其中:ServiceException,是异常错误抛出类,

ServiceException.java

/**
* 服务异常
*/
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = 2956071387027987098L; private String msg;
// 通用错误为-1,其他错误应该有编码
private String code = "-1"; public ServiceException(String msg) {
super(msg);
this.msg = msg;
} public ServiceException(String msg, Throwable e) {
super(msg, e);
this.msg = msg;
} public ServiceException(String msg, String code) {
super(msg);
this.msg = msg;
this.code = code;
} public ServiceException(String msg, String code, Throwable e) {
super(msg, e);
this.msg = msg;
this.code = code;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} }

  

OK .就这么点代码,记住将各种资源文件设为resources(右键可以设置你懂的,不然运行会报各种空指针)。现在用junit 测试下:

	public String test() {

		String methodStr = "CreateProfileForm";
String resultJson = "{\"SplashPage\":{\"PageInfo\":{\"Locale\":\"zh_CN\",\"ReadOnly\":\"false\",\"CurrencyRoundTo\":\"1\",\"ConversationID\":\"OJ1548071788914\",\"UserIP\":\"60.174.206.71\",\"skin\":\"hainan\",\"SessionPageRandom\":\"\",\"LayoutType\":\"\",\"NavSelect\":\"\",\"Language\":\"zh\",\"FromServicing\":\"false\",\"POS\":{\"CompanyCode\":\"\"},\"Currency\":\"CNY\",\"SessionID\":\"CD8BFD11D1AFA6D27375EAF307CB59F5.TVIBEServer4\"},\"CreateSessionForm\":{\"LanguageInput\":{\"name\":\"language\",\"type\":\"list\",\"value\":\"zh\"},\"method\":\"post\",\"RemoveLowPriceCacheQueryInput\":{\"name\":\"removeLowPriceCacheQuery\",\"type\":\"fixed\",\"value\":\"false\"},\"TestModeInput\":{\"name\":\"testMode\",\"type\":\"fixed\",\"value\":\"A\"},\"name\":\"CreateSessionForm\",\"action\":\"/common/homeRedirect.do\",\"RedirectedInput\":{\"name\":\"redirected\",\"type\":\"fixed\",\"value\":\"true\"},\"MarketInput\":{\"name\":\"market\",\"type\":\"list\",\"value\":\"CN\"},\"ChannelInput\":{\"name\":\"channel\",\"type\":\"fixed\",\"value\":\"IBE\"},\"RequestorIDInput\":{\"name\":\"requestorID\",\"Error\":{\"Param\":[{\"_text\":\"Unauthorised RequestorID\"}],\"Validator\":\"Error\"},\"type\":\"fixed\",\"value\":\"IBE\"},\"ShowLowPriceAirLineNumInput\":{\"name\":\"showLowPriceAirLineNum\",\"type\":\"fixed\",\"value\":\"\"}}}}"; // 处理一般错误
if (resultJson.contains("Error")) {
List<String> errorStrList = TribeCheckErrorUtils.checkedError(methodStr, resultJson);
if (errorStrList != null && errorStrList.size() > 0) {
String shortDiscription = "";
for (String str : errorStrList) {
shortDiscription = TribeCheckErrorUtils.getValidator(str);
handleSpecialError(str, shortDiscription);
} throw new ServiceException("内部服务发生错误", shortDiscription);
}
} return "test";
} private void handleSpecialError(String specialErrorMessage, String shortDiscription){
String _text = "";
if (org.apache.commons.lang.StringUtils.equals(shortDiscription, "Error") && org.apache.commons.lang.StringUtils.startsWith(specialErrorMessage, "{")) {
JSONObject parseObject = JSONObject.parseObject(specialErrorMessage);
if (parseObject.containsKey("Param") && parseObject.get("Param") instanceof JSONArray) {
Object object = ((JSONArray) parseObject.get("Param")).get(0);
if (object instanceof JSONObject && ((JSONObject) object).containsKey("_text")) {
_text = ((JSONObject) object).getString("_text");
}
}
}
if(org.apache.commons.lang.StringUtils.isNotEmpty(_text)) {
KieServices kieServices = KieServices.Factory.get();
KieContainer kieContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieContainer.newKieSession("spacialerrorSession"); SpecialErrorHandle errorHandle = new SpecialErrorHandle(_text,
"Unauthorised RequestorID",
"您的账户已被禁用,请联系客服进行处理!" );
kieSession.insert(errorHandle); kieSession.fireAllRules();
kieSession.dispose();
}
}

  

规则引擎 drools的更多相关文章

  1. 开源规则引擎 drools

    java语言开发的开源业务规则引擎 DROOLS(JBOSS RULES )具有一个易于访问企业策略.易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快.效率高.业务分析师或审核人员可以利用 ...

  2. 规则引擎drools封装

    一.前言 网上规则引擎drools介绍很多,并且有很多细致的说明,作者也不敢托大说自己的好用,但作者经过2个项目使用过规则引擎后,自己对规则引擎的理解并进行封装,对规则内容及如何使用,有自己的一番实践 ...

  3. 开源规则引擎 Drools 学习笔记 之 -- 1 cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule

    直接进入正题 我们在使用开源规则引擎 Drools 的时候, 启动的时候可能会抛出如下异常: Caused by: java.lang.ClassCastException: cn.com.cheng ...

  4. 使用规则引擎Drools计算圆周率PI

    实际上是使用规则引擎能够更新工作内存区重新匹配规则实现迭代功能. 使用了策略模式实现. <规则引擎与RETE算法介绍> PPT : http://files.cnblogs.com/lov ...

  5. JAVA规则引擎 -- Drools

    Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  6. [Drools]JAVA规则引擎 -- Drools 2

    上一篇文章 http://blog.csdn.net/quzishen/archive/2011/01/25/6163012.aspx 描述了一些常用的drools的语法标签和一个模拟实例即发送积分的 ...

  7. [Drools]JAVA规则引擎 -- Drools

    Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  8. 小明历险记:规则引擎drools教程一

    小明是一家互联网公司的软件工程师,他们公司为了吸引新用户经常会搞活动,小明常常为了做活动加班加点很烦躁,这不今天呀又来了一个活动需求,我们大家一起帮他看看. 小明的烦恼 活动规则是根据用户购买订单的金 ...

  9. 规则引擎drools的简单使用

    规则引擎适用于有复杂多变的规则,如商品满减.积分赠送.考勤规则等 一.引入maven依赖 <dependency> <groupId>org.drools</groupI ...

随机推荐

  1. phpstorm----------phpstorm如何安装和使用laravel plugin

    1.安装 2.安装成功以后,删除项目里面的.idea文件.然后关闭phpstrom,重新打开该项目,就会提示你 然后.idea里面就会生成 laravel-plugin.xml 文件.就可以使用直接C ...

  2. NuGet的简单使用

    什么是NuGet? NuGet(读作New Get)是用于微软.NET开发平台的软件包管理器,是一个Visual Studio的扩展.在使用Visual Studio开发基于.NET Framewor ...

  3. java操作JacocClient下载dump文件

    记录瞬间 import org.jacoco.core.data.ExecutionDataWriter; import org.jacoco.core.runtime.RemoteControlRe ...

  4. WebApi接口访问异常问题。尝试创建“testController”类型的控制器时出错。请确保控制器具有无参数公共构造函数

    本来运行的好好的webAPI 接口突然报了个 :“尝试创建“testController”类型的控制器时出错.请确保控制器具有无参数公共构造函数” 错误.耗了半宿最终解决了, 原因: api控制器中引 ...

  5. Python strip()与lstrip()、rstrip()

    .strip()方法可以根据条件遍历字符串中的字符并一一去除 默认去除字符串中的头尾空格 “  Alins  ”.“  AA  BB  CC  ”用了之后就是 “Alins”.“AA  BB  CC” ...

  6. DotNetCore 部署到IIS 上

    将 DotNetCore MVC 项目成功部署到 IIS 上,记录下配置要点: 1.在 ASP.NET Core 应用中使用 Kestrel Microsoft.AspNetCore.App 元包中包 ...

  7. centos安装mariadb

    一  配置mariadb官方的yum源 1.进入yum仓库 /etc/yum.repos.d/目录下 手动创建一个 mariadb.repo 写入如下内容 [mariadb] name = Maria ...

  8. Git仓库完全迁移,包括所有的分支和标签,当然也包括日志

    一.删除原有远程仓库地址 git remote rm origin 添加新的仓库地址 cd existing_repo git remote add origin <URL> git pu ...

  9. connect设置连接超时

    转自:庖丁解牛 /** * connect_timeout - 带超时的connect(方法中已执行connect) * @fd:文件描述符 * @addr:地址结构体指针 * @wait_secon ...

  10. DUILIB消息处理过程

    DUILIB消息处理机制 方法一. 首先窗口基类创建 CWindowWnd->Create() 调用 CWindowWnd->RegisterWindowClass() 注册 CWindo ...