springboot整合规则引擎URule
前言: 项目中要使用规则引擎,所以本人有尝试使用urule这款国内公司开发的规则引擎,用的是开源版的
- 相比其他规则引擎,urule有如下特点:
- 响应毫秒级
- 支持规则在client的缓存,并自动比对更新时间,减少网络IO,但客户端需要引入jar
- 原生支持动态规则和两种规则持久化方式(文件,数据库)
- 支持决策树,决策表等
- 集成了可视化规则管理界面,管理规则方便
- 社区活跃度低,技术支持需要付费
- 功能强大,但开源版功能有限
这里介绍一下如何将URule整合到springBoot项目中
官方文档:http://www.bstek.com/resources/doc/
先来瞅瞅他的管理界面长啥样!
按层级从上往下是 项目(就是图中的UCTest)--知识包--决策表/决策树等--库
1.库是最低的层级: 在这里创建需要校验的基本数据或者POJO, 如图上我就是想对UserParam进行校验.将名称和全类名添加进去.
2.决策集\决策树就是一个个具体的规则了.
在这里以库为校验对象创建规则.
3.知识包是多个决策树/决策集的集合,创建知识包之后再加入决策集
4.项目下面包含多个知识包,可以将知识包暴露给多个客户端
直接在树菜单上右键即可操作.
服务端配置:
pom.xml
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!-- urule规则引擎 --><dependency><groupId>com.bstek.urule</groupId><artifactId>urule-console</artifactId><version>2.1.6</version></dependency></dependencies>
需要两个核心类:
1.config.java
@Configuration
@ImportResource({"classpath:urule-console-context.xml"})
@PropertySource(value = {"classpath:urule-console-context.properties"})
public class Config {@Beanpublic PropertySourcesPlaceholderConfigurer propertySourceLoader() {PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();configurer.setIgnoreUnresolvablePlaceholders(true);configurer.setOrder(1);return configurer;}@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource datasource() {return DataSourceBuilder.create().build();}
}
这里其实就是引入jar包中的配置文件:
classpath:urule-console-context.xml
classpath:urule-console-context.properties
非maven项目参考: https://blog.csdn.net/su1573/article/details/82178544
2.URuleServletRegistration.java
package com.example.demo.ur;import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import com.bstek.urule.console.servlet.URuleServlet;@Component
public class URuleServletRegistration {@Beanpublic ServletRegistrationBean registerURuleServlet(){return new ServletRegistrationBean(new URuleServlet(),"/urule/*");}
}
3. 配置文件:application.yml(当然,这些配置你想放到properties文件或者配置中心都可以), 主要配置持久化的数据库地址
spring:datasource:jdbc-url: 这里写数据库地址driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: 1234jackson:default-property-inclusion: non_nullserver:port: 8755
然后直接用springBoot启动类启动就好了,再输入http://localhost:8755/urule/frame
就可以看到管理界面了
客户端配置
pom.xml
<!-- urule规则引擎 --><dependency><groupId>com.bstek.urule</groupId><artifactId>urule-console</artifactId><version>2.1.6</version></dependency>
application.yml配置服务端地址:
urule:resporityServerUrl: http://localhost:8755knowledgeUpdateCycle: 1
如果“urule.knowledgeUpdateCycle”属性值大于1,那么客户端会首先检查本地缓存中是否存在指定的知识包,如果存在,那么就拿当前时间与本地缓存中的知识包的时间戳进行比较,如果小于“urule.knowledgeUpdateCycle”属性值,那么就直接取这个知识包,如果大于它,那么就到URule Server上通过时间戳检查当前知识包有没有更新,如果有更新则取到客户端,同时更新客户端缓存里对应的知识包;如果没有更新,那么就直接采用当前客户端缓存里的知识包。
客户端调用:
package tt;
import rete.test.Dept;
import rete.test.Employee;
import com.bstek.urule.Utils;
import com.bstek.urule.runtime.KnowledgePackage;
import com.bstek.urule.runtime.KnowledgeSession;
import com.bstek.urule.runtime.KnowledgeSessionFactory;
import com.bstek.urule.runtime.service.KnowledgeService;public class Invoke {public void doTest() throws Exception{//从Spring中获取KnowledgeService接口实例KnowledgeService service=(KnowledgeService)Utils.getApplicationContext().getBean(KnowledgeService.BEAN_ID);//通过KnowledgeService接口获取指定的资源包"项目名/知识包名"KnowledgePackage knowledgePackage=service.getKnowledge("UCTest/UCBag");//通过取到的KnowledgePackage对象创建KnowledgeSession对象KnowledgeSession session=KnowledgeSessionFactory.newKnowledgeSession(knowledgePackage);Employee employee=new Employee();Dept dept=new Dept();dept.setLevel(12);employee.setDept(dept);employee.setSalary(111000);//将业务数据对象Employee插入到KnowledgeSession中session.insert(employee);//执行所有满足条件的规则session.fireRules();}
}
可以直接把上面这段代码嵌入web项目的controller
getKnowledge(..)方法必须传入的是"项目名/知识包名",我之前就没有创建知识包,写的是规则名所以获取服务失败了.
新增修改知识包之后必须先发布知识包,再将其推送至客户端才可以使用
springboot整合规则引擎URule相关推荐
- SpringBoot 整合模板引擎 Thymeleaf 页面跳转失败的解决方案
1. 出错现象 我们知道 Thymeleaf 模板引擎规定的文件路劲应该是在 templates 目录下面的. 但是笔者在开发的过程中,满足了上述要求但是还是没能映射成功. 我们来看看 index.h ...
- 规则引擎Drools详细介绍
规则引擎Drools详细介绍 一. 规则引擎概述 1.1 什么是规则引擎 1.2 使用规则引擎的优势 1.3 规则引擎应用场景 1.4 Drools介绍 二. Drools使用与说明 2.1 Droo ...
- springboot中使用规则引擎Drools
文章目录 规则引擎的场景 规则引擎介绍 使用规则引擎的优势 规则引擎应用场景 rools介绍 Drools入门案例 规则引擎构成 Drools基础语法 springboot使用规则引擎 规则引擎的场景 ...
- 黑马Drools学习笔记(一)——Drools规则引擎示例概述以及SpringBoot整合示例
文章目录 1. 问题引出 2. 规则引擎概述 2.1 什么是规则引擎 2.2 使用规则引擎的优势 2.3 规则引擎应用场景 2.4 Drools介绍 3. Drools入门案例 3.1 业务场景说明 ...
- SpringBoot整合Drools规则引擎动态生成业务规则
最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...
- SpringBoot2 整合 Drools规则引擎,实现高效的业务规则
本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...
- URULE规则引擎部署
简介 urule规则引擎是纯java开发,运行时借鉴Rete了算法的优势,独创了一套自己的规则模式匹配算法,这套算法可以从根本上保证规则运行的效率,实现大量复杂业务规则计算时的毫秒级响应. urule ...
- 【模板引擎】Springboot整合ThymeleafThymeleaf基本语法
Thymeleaf介绍 thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发.它是一个开源的Java库,基于Apache License 2.0许可, ...
- 「快学springboot」SpringBoot整合freeMark模板引擎
前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来 ...
- springboot之ice规则引擎探索
突然发现一个非常棒的框架,迫不及待的想要和大家分享一下 规则引擎 什么是规则引擎 规则引擎是一种工具,它使得这种计算模型编程变得更容易.它可能是一个完整的开发环境,或者一个可以在传统平台上工作的框架. ...
最新文章
- LeetCode实战:整数反转
- c++ socket 连接超时_Web性能优化之-HTTP长连接
- MySQL面试题 数据库设计三范式
- 使用 SAP HANA Virtual Table 连接外部数据源
- HDU 1402 A * B Problem Plus FFT
- 搞了这么久的产品,终于看清了真相
- MongoDB Hot Backup 测试及痛点
- C#事件-什么是事件
- 使用脚本 Nodesource快速安装nodejs环境
- 【深入理解JS核心技术】14. 什么是一元函数
- 写文章不会起标题?爬取虎嗅5万篇文章告诉你
- 403 Forbidden error
- 「TYVJ1017」冗余关系
- SA-NET: Shuffle attention for DCNN 论文学习
- 大白菜装机教程win10_如何用光盘快速重装系统(图文教程)
- nagios监控 mysql 表结构
- 空气源热泵控制系统解决方案
- PMO如何选择项目管理工具?
- 物体移出镜头外出现ui提示
- 立冬穿短袖,生活不将就 2020.11.18日记
热门文章
- 【连载】【STM32神舟III号实验例程】SysTick实验(11)
- React移动web极致优化
- java毕业设计户籍管理系统(附源码、数据库)
- 如何根据vin码查询_VIN车辆识别代码查询
- python识别车辆图片_opencv+python车辆识别
- 基于transformer的车辆识别
- pcshare远控软件编译过程
- 冰点还原离线激活_冰点还原密钥,详细教您如何激活冰点还原
- Android 补间动画之平移动画TranslateAnimation
- UE4.27 Live Link Face无法连接的一种解决办法