前言: 项目中要使用规则引擎,所以本人有尝试使用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相关推荐

  1. SpringBoot 整合模板引擎 Thymeleaf 页面跳转失败的解决方案

    1. 出错现象 我们知道 Thymeleaf 模板引擎规定的文件路劲应该是在 templates 目录下面的. 但是笔者在开发的过程中,满足了上述要求但是还是没能映射成功. 我们来看看 index.h ...

  2. 规则引擎Drools详细介绍

    规则引擎Drools详细介绍 一. 规则引擎概述 1.1 什么是规则引擎 1.2 使用规则引擎的优势 1.3 规则引擎应用场景 1.4 Drools介绍 二. Drools使用与说明 2.1 Droo ...

  3. springboot中使用规则引擎Drools

    文章目录 规则引擎的场景 规则引擎介绍 使用规则引擎的优势 规则引擎应用场景 rools介绍 Drools入门案例 规则引擎构成 Drools基础语法 springboot使用规则引擎 规则引擎的场景 ...

  4. 黑马Drools学习笔记(一)——Drools规则引擎示例概述以及SpringBoot整合示例

    文章目录 1. 问题引出 2. 规则引擎概述 2.1 什么是规则引擎 2.2 使用规则引擎的优势 2.3 规则引擎应用场景 2.4 Drools介绍 3. Drools入门案例 3.1 业务场景说明 ...

  5. SpringBoot整合Drools规则引擎动态生成业务规则

    最近的项目中,使用的是flowable工作流来处理业务流程,但是在业务规则的配置中,是在代码中直接固定写死的,领导说这样不好,需要规则可以动态变化,可以通过页面去动态配置改变,所以就花了几天时间去研究 ...

  6. SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

    本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...

  7. URULE规则引擎部署

    简介 urule规则引擎是纯java开发,运行时借鉴Rete了算法的优势,独创了一套自己的规则模式匹配算法,这套算法可以从根本上保证规则运行的效率,实现大量复杂业务规则计算时的毫秒级响应. urule ...

  8. 【模板引擎】Springboot整合ThymeleafThymeleaf基本语法

    Thymeleaf介绍 thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发.它是一个开源的Java库,基于Apache License 2.0许可, ...

  9. 「快学springboot」SpringBoot整合freeMark模板引擎

    前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来 ...

  10. springboot之ice规则引擎探索

    突然发现一个非常棒的框架,迫不及待的想要和大家分享一下 规则引擎 什么是规则引擎 规则引擎是一种工具,它使得这种计算模型编程变得更容易.它可能是一个完整的开发环境,或者一个可以在传统平台上工作的框架. ...

最新文章

  1. LeetCode实战:整数反转
  2. c++ socket 连接超时_Web性能优化之-HTTP长连接
  3. MySQL面试题 数据库设计三范式
  4. 使用 SAP HANA Virtual Table 连接外部数据源
  5. HDU 1402 A * B Problem Plus FFT
  6. 搞了这么久的产品,终于看清了真相
  7. MongoDB Hot Backup 测试及痛点
  8. C#事件-什么是事件
  9. 使用脚本 Nodesource快速安装nodejs环境
  10. 【深入理解JS核心技术】14. 什么是一元函数
  11. 写文章不会起标题?爬取虎嗅5万篇文章告诉你
  12. 403 Forbidden error
  13. 「TYVJ1017」冗余关系
  14. SA-NET: Shuffle attention for DCNN 论文学习
  15. 大白菜装机教程win10_如何用光盘快速重装系统(图文教程)
  16. nagios监控 mysql 表结构
  17. 空气源热泵控制系统解决方案
  18. PMO如何选择项目管理工具?
  19. 物体移出镜头外出现ui提示
  20. 立冬穿短袖,生活不将就 2020.11.18日记

热门文章

  1. 【连载】【STM32神舟III号实验例程】SysTick实验(11)
  2. React移动web极致优化
  3. java毕业设计户籍管理系统(附源码、数据库)
  4. 如何根据vin码查询_VIN车辆识别代码查询
  5. python识别车辆图片_opencv+python车辆识别
  6. 基于transformer的车辆识别
  7. pcshare远控软件编译过程
  8. 冰点还原离线激活_冰点还原密钥,详细教您如何激活冰点还原
  9. Android 补间动画之平移动画TranslateAnimation
  10. UE4.27 Live Link Face无法连接的一种解决办法