首页 > 其他分享 >drools规则引擎

drools规则引擎

时间:2024-05-15 14:52:14浏览次数:8  
标签:drools import new order 引擎 user 规则 org Order

https://www.cnblogs.com/ityml/p/15993391.html

 

<!-- 规则引擎 -->
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<version>${drools.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>

package com.ityml.drools.config;

import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import java.io.IOException;


/**
* <p> 规则引擎自动配置类 </p>
* @author ityml
* @date 2019/9/10 11:20
*/
@Configuration
public class DroolsAutoConfiguration {

  private static final String RULES_PATH = "rules/";

  private KieServices getKieServices() {

     return KieServices.Factory.get();
  }

 

 

  @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(() -> kieRepository.getDefaultReleaseId());

    KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());
    kieBuilder.buildAll();

    KieContainer kieContainer = getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());

    return kieContainer;
  }

 

  @Bean
  @ConditionalOnMissingBean(KieBase.class)
  public KieBase kieBase() throws IOException {
    return kieContainer().getKieBase();
  }

}

@Data
@Accessors(chain = true)
public class Order {

/**
* 订单原价金额
*/
private int price;

/**
*下单人
*/
private User user;

/**
*积分
*/
private int score;

/**
* 下单日期
*/
private Date bookingDate;
}

package rules

import com.ityml.drools.entity.Order

rule "zero"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout <= 100)
then
$s.setScore(0);
update($s);
end

rule "add100"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 100 && amout <= 500)
then
$s.setScore(100);
update($s);
end

rule "add500"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 500 && amout <= 1000)
then
$s.setScore(500);
update($s);
end

rule "add1000"
no-loop true
lock-on-active true
salience 1
when
$s : Order(amout > 1000)
then
$s.setScore(1000);
update($s);
end

/**
* 需求
* 计算额外积分金额 规则如下: 订单原价金额
* 100以下, 不加分
* 100-500 加100分
* 500-1000 加500分
* 1000 以上 加1000分
*/
public class DroolsOrderTests extends DroolsApplicationTests {
@Resource
private KieContainer kieContainer;

@Test
public void Test() throws Exception {
List<Order> orderList = getInitData();
for (Order order : orderList) {
if (order.getAmout() <= 100) {
order.setScore(0);
addScore(order);
} else if (order.getAmout() > 100 && order.getAmout() <= 500) {
order.setScore(100);
addScore(order);
} else if (order.getAmout() > 500 && order.getAmout() <= 1000) {
order.setScore(500);
addScore(order);
} else {
order.setScore(1000);
addScore(order);
}
}
}

@Test
public void droolsOrderTest() throws Exception {
KieSession kieSession = kieContainer.newKieSession();
List<Order> orderList = getInitData();
for (Order order: orderList) {
// 1-规则引擎处理逻辑
kieSession.insert(order);
kieSession.fireAllRules();
// 2-执行完规则后, 执行相关的逻辑
addScore(order);
}
kieSession.dispose();
}

 

private static void addScore(Order o){
System.out.println("用户" + o.getUser().getName() + "享受额外增加积分: " + o.getScore());
}

private static List<Order> getInitData() throws Exception {
List<Order> orderList = new ArrayList<>();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
{
Order order = new Order();
order.setAmout(80);
order.setBookingDate(df.parse("2015-07-01"));
User user = new User();
user.setLevel(1);
user.setName("Name1");
order.setUser(user);
order.setScore(111);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(200);
order.setBookingDate(df.parse("2015-07-02"));
User user = new User();
user.setLevel(2);
user.setName("Name2");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(800);
order.setBookingDate(df.parse("2015-07-03"));
User user = new User();
user.setLevel(3);
user.setName("Name3");
order.setUser(user);
orderList.add(order);
}
{
Order order = new Order();
order.setAmout(1500);
order.setBookingDate(df.parse("2015-07-04"));
User user = new User();
user.setLevel(4);
user.setName("Name4");
order.setUser(user);
orderList.add(order);
}
return orderList;
}
}

标签:drools,import,new,order,引擎,user,规则,org,Order
From: https://www.cnblogs.com/qlsty/p/18193856

相关文章

  • fiddler自定义规则
     请求前拦截某个请求staticfunctionOnBeforeRequest(oSession:Session){if(oSession.url.indexOf("initialCid=")>-1&&oSession.url.indexOf("dm=cd")>-1){oSession.oRequest.FailSession(666,"Blocked",&......
  • Gitee千Star优质项目解析: ng-form-element低开引擎解析
    好家伙,在写项目的时候,我发现自己的平台的组件写的实在是太难看了,于是想去gitee上偷点东西,于是我们本期的受害者出现了gitee项目地址https://gitee.com/jjxliu306/ng-form-elementplus-sample.git组件库以及引擎完全开源,非常牛逼的项目,非常牛逼的作者 项目名:ng-form-......
  • 在Linux中,如何配置防火墙和安全规则?
    在Linux中,配置防火墙和安全规则通常涉及使用iptables或较新的firewalld工具。以下是使用这两种工具的基本步骤和概念:1.使用iptables配置防火墙规则iptables是Linux内核的Netfilter框架的一部分,用于配置防火墙规则。它通过一系列链(chains)和规则(rules)来决定数据包的处理方式(如允......
  • 1-分库分表概述_工作过程_分片规则_目录结构_配置文件
    1.分库分表概述工作过程分片规则目录结构配置文件分库分表概述 工作过程 分片规则 目录结构 配置文件分库分表应用注意1.在数据库设计时考虑垂直分库和垂直分表2.数据量增加时,不要马上做水平分割,而是先考虑缓存处理、读写分离、使用索引等方式。如果以上方式不能解决,......
  • PikaScript - 面向嵌入式的超轻量级python引擎+Ring-Buffer - 仅80行代码的超简洁环形
    1、PikaScript-面向嵌入式的超轻量级python引擎PikaScript(前称mimiscript)是一个完全重写的超轻量级python引擎,零依赖,零配置,可以在少于4KB的RAM下运行(如stm32g030c8和stm32f103c8),极易部署和扩展。项目地址:https://github.com/pikasTech/pikascriptPikaScript是使用c语言写......
  • 详解GaussDB(DWS)中的行执行引擎
    本文分享自华为云社区《GaussDB(DWS)行执行引擎详解》,作者:yd_227398895。1.前言GaussDB(DWS)包含三大引擎,一是SQL执行引擎,用来解析用户输入的SQL语句,生成执行计划,供执行引擎来执行;二是执行引擎,其中包含了行执行引擎和列执行引擎,执行引擎即查询的执行者,位于优化器和存储引擎之间,负......
  • 关系代数与逻辑优化规则 (一): 定义
    作者:zhuwenzhuang,2024.05.08.阅读前假设读者熟悉数据库使用,了解SQL的语法和关系算子的大概含义,能通过EXPLAIN命令查看数据库执行计划.0前言数据库优化器的查询优化(QueryOptimization)指在查询等价的前提下,将代价更高的查询转化为代价更低的查询的过程.查询......
  • java虚拟机内存结构——类加载器,运行时数据区,执行引擎,本地方法接口。《深入理解JAVA虚
    ##类加载器类加载器当Java程序需要使用某个类时,类加载子系统负责找到对应的.class文件,并将其加载到JVM的方法区中每一个类加载器,都拥有一个独立的类名称空间。只有在这两个类是由同一个类加载器加载的前提下才有意义##运行时数据区###线程共享####堆:内......
  • [18] C++虚幻引擎功能拓展
    Day1添加轴动作EAxis::Type//轴方向枚举//旋转输入轴UInputModifierSwizzleAxis*SwizzleAxis=NewObject<UInputModifierSwizzleAxis>(MappingContext);KeyMapping.Modifiers.Add(SwizzleAxis);//取反输入轴UInputModifierNegate*Negate=NewObject<UInputModifierNe......
  • Whose:轻量级搜索引擎工具
    #Whoosh简介Whoosh由MattChaput创建,它一开始是一个为Houdini3D动画软件包的在线文档提供简单、快速的搜索服务工具,之后便慢慢成为一个成熟的搜索解决工具并已开源。Whoosh纯由Python编写而成,是一个灵活的,方便的,轻量级的搜索引擎工具,现在同时支持Python2、3,其优点如......