drools入门示例
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入门示例的更多相关文章
- [WCF编程]1.WCF入门示例
一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...
- Maven入门示例(3):自动部署至外部Tomcat
Maven入门示例(3):自动部署至外部Tomcat 博客分类: maven 2012原创 Maven入门示例(3):自动部署至外部Tomcat 上一篇,介绍了如何创建Maven项目以及如何在内 ...
- 1.【转】spring MVC入门示例(hello world demo)
1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于 ...
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- Spring MVC 入门示例讲解
在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...
- Couchbase之个人描述及入门示例
本文不打算抄袭官方或者引用他人对Couchbase的各种描述,仅仅是自己对它的一点理解(错误之处,敬请指出),并附上一个入门示例. ASP.NET Web项目(其他web开发平台也一样)应用规模小的时 ...
- Velocity魔法堂系列一:入门示例
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- OUYA游戏开发核心技术剖析OUYA游戏入门示例——StarterKit
第1章 OUYA游戏入门示例——StarterKit StarterKit是一个多场景的游戏示例,也是OUYA官方推荐给入门开发者分析的第一个完整游戏示例.本章会对StarterKit做详细介绍,包 ...
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
随机推荐
- Python id() 函数
Python id() 函数 Python 内置函数 描述 id() 函数用于获取对象的内存地址. 语法 id 语法: id([object]) 参数说明: object -- 对象. 返回值 返回 ...
- VMware CentOS LVM磁盘扩容
一. 在虚拟机上增加磁盘空间 如下图. 增加完后会有提示 "磁盘已成功扩展.您必须从客户机操作系统内部对磁盘重新进行分区和扩展文件系统.是继续完成以下步骤才算成功. 二.调整虚拟机磁盘LVM ...
- MongoHelper
/* @@decription mongodbHelper @@version 1.0 @@author think_fish&&dachie @@copyright think_fi ...
- python之selenium调用js(execute_script)
转载: http://www.cnblogs.com/fnng/p/3230768.html 本节重点: 调用js方法 execute_script(script, *args) 在当前窗口/框架 同 ...
- python设置格式模板
# -*- coding: utf-8 -*- """ __mktime__ = '${DATE}' __author__ = '${USER}' __filename_ ...
- Python中numpy.apply_along_axis()函数的用法
numpy.apply_along_axis(func, axis, arr, *args, **kwargs): 必选参数:func,axis,arr.其中func是我们自定义的一个函数,函数fun ...
- ViewController的属性
[ViewController的属性] 1.navigationItem,只读,只第一次引用的时候被创建. The first time the property is accessed, the U ...
- 一)get started with the Quartz project
官网 http://www.quartz-scheduler.org/ 下载链接 http://www.terracotta.org/download/reflector.jsp?b=tcdistri ...
- 简单的ListView中item图片异步加载
前言: 在android开发当中,从目标地址获取图片往往都是采用异步加载的方法.当完全加载完图片后在进行显示,也有些是直接将加载的图片一点一点的显示出来. 这两个区别只是对流的处理不同而已.现 ...
- 微信小程序web-view之动态加载html页面
官方推出的web-view方便了很多开发人员. 我们在做的时候,经常会想到写一个小程序的page然后通过动态加载web-view的形式来完成其他功能页面的开发. 之前研究web-view的时候发现网上 ...