Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。随着互联网金融的兴起,个人信用资质的审核等业务如果采用硬编码的方式,规则一旦变了,那么编码也会改变,采用硬编码的方式就不能适应规则的快速变化。

  下面是我学习的springboot搭建的第一个规则引擎的例子,从网上学习的,感觉很好。链接《Drools7.0.0.Final规则引擎教程》之Springboot集成,编辑好的例子已经放到本人的GitHub上,可以下载运行。

测试类:TestController

@RequestMapping("/test")
@Controller
public class TestController { @Resource
private KieSession kieSession; @ResponseBody
@RequestMapping("/address")
public void test() {
Address address = new Address();
address.setPostcode("99425"); AddressCheckResult result = new AddressCheckResult();
FactHandle f = kieSession.insert(address);
FactHandle f1 = kieSession.insert(result);
int ruleFiredCount = kieSession.fireAllRules();
System.out.println("触发了" + ruleFiredCount + "条规则");
if (result.isPostCodeResult()) {
System.out.println("规则校验通过");
}
// kieSession.delete(f);
// kieSession.delete(f1);
// 这里添加过滤器
Address address1 = new Address();
address1.setPostcode("2017");
AddressCheckResult result1 = new AddressCheckResult();
kieSession.insert(address1);
kieSession.insert(result1);
AddressFilter addressFilter = new AddressFilter(address1);
int ruleFiredCount1 = kieSession.fireAllRules(addressFilter);
System.out.println("触发了" + ruleFiredCount1 + "条规则");
}
}

 

springboot运行类:

@SpringBootApplication
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class SpringbootDrools {
public static void main(String[] args) {
SpringApplication.run(SpringbootDrools.class, args); }
}

实体类:

public class Address {
private String postcode; private String street; private String state;
}
public class AddressCheckResult {
private boolean postCodeResult = false; // true:通过校验;false:未通过校验 public boolean isPostCodeResult() {
return postCodeResult;
} public void setPostCodeResult(boolean postCodeResult) {
this.postCodeResult = postCodeResult;
}
}

springboot自动配置的类,这个是与spring不同的地方,后面在springboot专题中专门讲如何将spring的配置文件转换到springboot

@Configuration
public class DroolsAutoConfiguration { private static final String RULES_PATH = "rules/"; @Bean
@ConditionalOnMissingBean(KieFileSystem.class)
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();
for (Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));
}
return kieFileSystem;
} private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");
} @Bean
@ConditionalOnMissingBean(KieContainer.class)
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = getKieServices().getRepository(); kieRepository.addKieModule(new KieModule() {
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
}); KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
kieBuilder.buildAll(); return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());
} private KieServices getKieServices() {
return KieServices.Factory.get();
} @Bean
@ConditionalOnMissingBean(KieBase.class)
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
} @Bean
@ConditionalOnMissingBean(KieSession.class)
public KieSession kieSession() throws IOException {
return kieContainer().newKieSession();
} @Bean
@ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)
public KModuleBeanFactoryPostProcessor kiePostProcessor() {
return new KModuleBeanFactoryPostProcessor();
}
}  

 

过滤器:自定义实现过滤某些规则。

public class AddressFilter implements AgendaFilter {

	// 传进来的是Address对象,把postcode以2017年开头的执行规则,否则不执行
private final Address address; public AddressFilter(Address address) {
this.address = address;
} @Override
public boolean accept(Match match) {
return match.getRule().getName().contains(address.getPostcode());
} }

运行结果:

规则中打印日志:校验通过!
规则中打印日志:校验通过2017!
触发了2条规则
规则校验通过
规则中打印日志:校验通过2017!
触发了1条规则

  

drools入门示例的更多相关文章

  1. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

  2. Maven入门示例(3):自动部署至外部Tomcat

    Maven入门示例(3):自动部署至外部Tomcat 博客分类:  maven 2012原创   Maven入门示例(3):自动部署至外部Tomcat 上一篇,介绍了如何创建Maven项目以及如何在内 ...

  3. 1.【转】spring MVC入门示例(hello world demo)

    1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于 ...

  4. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  5. Spring MVC 入门示例讲解

    在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...

  6. Couchbase之个人描述及入门示例

    本文不打算抄袭官方或者引用他人对Couchbase的各种描述,仅仅是自己对它的一点理解(错误之处,敬请指出),并附上一个入门示例. ASP.NET Web项目(其他web开发平台也一样)应用规模小的时 ...

  7. Velocity魔法堂系列一:入门示例

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  8. OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit

    第1章  OUYA游戏入门示例——StarterKit StarterKit是一个多场景的游戏示例,也是OUYA官方推荐给入门开发者分析的第一个完整游戏示例.本章会对StarterKit做详细介绍,包 ...

  9. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

随机推荐

  1. JSONArray的初始化的形式

    1 转义字符形式 [    {        \"ID\": \"1900036295\",        \"DEPT\": \" ...

  2. lammps模拟化学反应(1)

    1. Can I use lammps to chemical reaction systems?Please note that you can only get as good an answer ...

  3. 【bzoj3437】小P的牧场

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 947  Solved: 542[Submit][Status][Discuss ...

  4. Halcon二维仿射变换实例探究

    二维仿射变换,顾名思义就是在二维平面内,对对象进行平移.旋转.缩放等变换的行为(当然还有其他的变换,这里仅论述这三种最常见的). Halcon中进行仿射变换的常见步骤如下: ① 通过hom_mat2d ...

  5. gitweb配置

    基于ssh的git服务器搭建可浏览:https://www.cnblogs.com/wswind/p/10373881.html 安装gitweb和apache yum -y install gitw ...

  6. Android 一些注意

    半年没碰android,想给一个按钮写个click,硬是想不起来怎么搞,哎! 1.编码问题调整 2.引用框架问题 3.界面设计无法显示问题,需要调整设计界面的API Level 4.任意输入自动提示 ...

  7. dojoConfig包的配置(7/26号夜)

    主页代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  8. iOS9 Https技术预研

    一.服务器需要做的事情: 1.要注意 App Transport Security 要求 TLS 1.2, 2.而且它要求站点使用支持forward secrecy协议的密码. 3.证书也要求是符合A ...

  9. EBS 并发程序运行信息

    --并发程序运行信息SELECT REQUEST_ID,       PROGRAM,       actual_start_date 开始日期,       ACTUAL_COMPLETION_DA ...

  10. VMware虚拟机无法启动,提示“无法打开磁盘,未能锁定文件”

    VMware在进入linux时,提示:无法打开磁盘 F:\Debian\Debian linux2.6.x kernel.vmdk 或者某一个快照所依赖的磁盘原因: 未能锁定文件 问题出现的原因:虚拟 ...