规则引擎drools的使用(代码片段)

抓手 抓手     2022-11-30     229

关键词:

引入maven

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.14.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>7.14.0.Final</version>
        </dependency>

工具类封装

import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.builder.Message;
import org.kie.api.builder.Results;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.internal.utils.KieHelper;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;

/**
 * drools架构规则工具
 *
 * @author 向振华
 * @date 2022/06/30 17:29
 */
public class KieUtils 

    /**
     * 执行全部规则
     *
     * @param entity  规则文件中的实体类
     * @param globals 全局变量
     * @param drl     规则文件
     */
    public static void fireAllRules(Object entity, Map<String, Object> globals, String drl) 
        //会话对象,用于和规则引擎交互
        KieSession kieSession = getKieSession(entity, globals, drl);
        //激活规则引擎,如果规则匹配成功则执行规则
        kieSession.fireAllRules();
        //关闭会话
        kieSession.dispose();
    

    /**
     * 执行全部规则
     *
     * @param kSession
     */
    public static void fireAllRules(KieSession kSession) 
        //激活规则引擎,如果规则匹配成功则执行规则
        kSession.fireAllRules();
        //关闭会话
        kSession.dispose();
    

    /**
     * 获取KieSession
     *
     * @param entity  规则文件中的实体类
     * @param globals 全局变量
     * @param drl     规则文件
     * @return
     */
    public static KieSession getKieSession(Object entity, Map<String, Object> globals, String drl) 
        KieSession kieSession = getKieSession(drl);
        kieSession.insert(entity);
        if (!CollectionUtils.isEmpty(globals)) 
            for (String key : globals.keySet()) 
                kieSession.setGlobal(key, globals.get(key));
            
        
        return kieSession;
    

    /**
     * 获取KieSession
     *
     * @param drls 规则文件
     * @return
     */
    public static KieSession getKieSession(String... drls) 
        KieHelper kieHelper = new KieHelper();
        for (String drl : drls) 
            kieHelper.addContent(drl, ResourceType.DRL);
        
        verify(kieHelper);
        KieBaseConfiguration config = kieHelper.ks.newKieBaseConfiguration();
        config.setOption(EventProcessingOption.STREAM);
        KieBase kieBase = kieHelper.build(config);
        //创建KieSession
        return kieBase.newKieSession();
    

    /**
     * 校验规则文件
     *
     * @param drl 规则文件
     */
    public static void verify(String drl) 
        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(drl, ResourceType.DRL);
        verify(kieHelper);
    

    /**
     * 校验
     *
     * @param kieHelper
     */
    private static void verify(KieHelper kieHelper) 
        Results results = kieHelper.verify();
        List<Message> messages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR);
        if (!CollectionUtils.isEmpty(messages)) 
            StringBuilder error = new StringBuilder("规则文件错误 ");
            for (Message message : messages) 
                error.append(message.getText()).append(";");
            
            throw new RuntimeException(error.toString());
        
    

定义entity

/**
 * @author 向振华
 * @date 2022/06/30 16:11
 */
public class DemoEntity 

    private String name;
    private String remark;

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getRemark() 
        return remark;
    

    public void setRemark(String remark) 
        this.remark = remark;
    

    public DemoEntity() 

    

    public DemoEntity(String name) 
        this.name = name;
    

    @Override
    public String toString() 
        return "DemoEntity" +
                "name='" + name + '\\'' +
                ", remark='" + remark + '\\'' +
                '';
    

创建规则文件demo.drl

package demo
import com.xzh.drools.entity.DemoEntity

rule "demo"
    when
        $demo:DemoEntity(name contains "小明")
    then
        $demo.setRemark("哈喽" + $demo.getName());
        System.out.println("规则执行 ---> " + $demo.getRemark());
end

测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class DemoTest 

    @Test
    public void test1() throws IOException 
        DemoEntity entity = new DemoEntity("小明");
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource resource = resourcePatternResolver.getResource("classpath:rules/demo.drl");
        byte[] bytes = IOUtils.toByteArray(resource.getInputStream());
        String drl = new String(bytes);
        KieUtils.fireAllRules(entity, null, drl);
    

结果

规则执行 ---> 哈喽小明

drools规则引擎一文读懂(代码片段)

目录一、Drools简介电商平台的促销活动规则引擎Drools简介二、Drools快速入门 电商平台促销积分规则开发实现三、Drools规则引擎构成及其核心类Drools规则引擎构成Drools规则引擎概念四、Drools基础语法规则文件构成 规则体语法结... 查看详情

drools规则引擎环境搭建(代码片段)

一、关于drools规则引擎前面写过一篇Drools规则引擎相关的文章,这篇文章主要记录一下规则引擎的环境搭建和简单示例。不熟悉drools的朋友可以看看这篇文章:自己写个Drools文件语法检查工具——栈的应用之编译器检测语法错误... 查看详情

35activiti整合规则引擎drools(代码片段)

喜欢关注公众号:java乐园日常生活是由规则驱动的。红灯停绿灯行,这是我们的交通规则;我们站着往上跳,最终还是要落下来,这是地球的引力规则。规则在生活中无处不在。软件开发中我们也需要规则,满足什么规则应该... 查看详情

drools规则引擎入门指南(代码片段)

本篇博客主要讲解Drools常用的属性以及函数属性首先我们在resourcesules文件夹下创建一个Property.drl,还有一个DroolsApplicationPropertyTests1.salience优先级salience属性的值默认为0,它的值越大执行的优先级就越高,看如下代码在执行的时候... 查看详情

drools规则引擎中易混淆语法分析_循环触发导致死循环分析(代码片段)

...开发与测试阶段解决了,未波及到prod。首先看这样两条规则/***规则1_set默认利率*/rule"rate_default"no-looptruewhen$request:AmountRateRequest(calculateEnum==CalculateEnum.INTEREST||calculateEnum==CalculateEnu 查看详情

java规则引擎--drools

Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。 本文所使用的demo已上传 http... 查看详情

drools规则引擎初探(代码片段)

...么Drools是为Java量身定制的基于Charles Forgy的RETE算法的规则引擎的实现。具有了OO接口的RETE,使得商业规则有了更自然的表达。Rule是什么呢? 一条规则是对商业知识的编码。一条规则有 attributes ,一个 LeftHandSide&... 查看详情

什么时候使用规则引擎drools

参考技术A规则引擎一般是一下情况使用1.为提高效率,管理流程必须自动化,即使现代商业规则异常复杂。2.市场要求业务规则经常变化,IT系统必须依据业务规则的变化快速、低成本的更新。3.为了快速、低成本的更新,业务人... 查看详情

drools简单应用(代码片段)

...事。  最近在对项目的积分模块进行改造的时候想到了规则引擎,使用规则引擎处理复杂而且多变的业务逻辑有其非常大的优势,包括实时更新、性能等方面。不多说,直接上代码:1、第一步先写好工具类,有了工具类,只... 查看详情

drools7hellowrold入门详细步骤--系列01课(代码片段)

一、什么叫规则引擎?规则---》写在文档上引擎---》在java代码上,引用这个文档上的规则二、drools规则引擎有什么用?简单来说就是将多变的规则,从业务代码中剥离出来(当规则变了之后,不用修改代码,而是修改一份文本... 查看详情

规则引擎drools的简单使用

规则引擎适用于有复杂多变的规则,如商品满减、积分赠送、考勤规则等一、引入maven依赖<dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>7.13.0.Final</version></de 查看详情

规则引擎drools示例:个人所得税计算器信用卡申请保险产品准入规则(代码片段)

...一、Drools实战1.1个人所得税计算器1.1.1名词解释1.1.2计算规则1.1.3实现步骤1.2信用卡申请1.2.1计算规则1.2.2实现步骤1.3保险产品准入规则1.3.1决策表1.3.2规则介绍1.3.3实现步骤一、Drools实战1.1个人所得税计算器本小节我们需要通过Drool... 查看详情

.netrulesengine规则引擎使用(代码片段)

        规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业... 查看详情

java开源的规则引擎drools电商行业实战(含完整代码)(代码片段)

...量是动态的,另外考虑到扩展性,满足将来业务规则的增长,不只是限制领取数需要新加其他条件,为了满足不断变化的业务场景,经分析后选用规则引擎Drools来实现。本场Chat通过一个电商行业的领取优惠券... 查看详情

drools整合springboot整合drools测试例子--个税计算器规则(代码片段)

规则引擎,主要作用,就是将规则与java代码分离,可通过修改规则实时生效。让非java程序员,只要熟悉业务,也可以写规则。规则引擎主要用在一些,打折、风控前置、后置、结算等模块地方。新建一个droolsdemo的maven工程。pom.... 查看详情

规则引擎drools在贷后催收业务中的应用

...gXiang在日常业务开发工作中我们经常会遇到一些根据业务规则做决策的场景。为了让开发人员从大量的规则代码的开发维护中释放出来,把规则的维护和生成交由业务人员,为了达到这种目的通常我们会使用规则引擎来帮助我们... 查看详情

数据驱动规则引擎 - Drools

】数据驱动规则引擎-Drools【英文标题】:DataDrivenRulesEngine-Drools【发布时间】:2013-08-2322:51:57【问题描述】:我一直在评估Drools作为我们的业务Web应用程序中使用的规则引擎。我的用例是一个订单管理应用程序。规则如下:-如果... 查看详情

如何快速学习 Drools 或其他规则引擎 [关闭]

】如何快速学习Drools或其他规则引擎[关闭]【英文标题】:howtolearnDroolsoranotherruleenginefast[closed]【发布时间】:2011-02-0602:08:03【问题描述】:我们正在着手开发一个模块,该模块将根据某些标准生成一些建议。标准将采用一组业... 查看详情