规则引擎drools的简单使用

half-two-feet half-two-feet     2023-01-13     250

关键词:

规则引擎适用于有复杂多变的规则,如商品满减、积分赠送、考勤规则等

一、引入maven依赖

<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>7.13.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>7.13.0.Final</version>
</dependency>

  

二、drools有两种执行方式,第一种是基于kmodule.xml、drl配置文件,第二种是动态读取规则

基于kmodule方式

 1)创建Fact,drools中的Fact即是java中的普通的bean,用于传递参数

package com.beyond.odc.entity;

/**
 * Fact java bean
 * @author Hejinsheng
 */
public class Message 

    private String message;

    private String result;

    private int status;

    public String getMessage() 
        return this.message;
    

    public void setMessage(String message) 
        this.message = message;
    

    public int getStatus() 
        return this.status;
    

    public void setStatus(int status) 
        this.status = status;
    

    public String getResult() 
        return result;
    

    public void setResult(String result) 
        this.result = result;
    

  

 2)在resources/META-INF下创建kmodule.xml文件,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
    </kbase>
</kmodule>

  

3)在resources/rules文件夹下创建规则描述文件rules.drl,内容如下

package rules

import com.beyond.odc.entity.Message;

rule "hello"
    no-loop true
    lock-on-active true
    when
        $message:Message(status==0)
    then
        System.out.println("消息:"+$message.getMessage());
        $message.setResult("hello 响应的消息");
        update($message)
end

rule "byebye"
    no-loop true
    lock-on-active true
    when
        $message:Message(status==1)
    then
        System.out.println("消息:"+$message.getMessage());
        $message.setResult("byebye 响应的消息");
        update($message)
end

  

 4)编写测试文件

public static void main(String[] args) 
       try 

            KieSession kSession = KieContainerFactory.getKieContainer().newKieSession("ksession-rules");

            Message message = new Message();
            message.setMessage("hello");    // 对应drl文件中的rule name,表示要执行的规则
            message.setStatus(0);           // 取message中的某个字段,用户规则文件中的判断是否执行代码块
            kSession.insert(message);       // 将message作为传递的参数传入drools执行
            kSession.fireAllRules();        // 加载规则
            System.out.println("从drools中接收到的消息:"+message.getResult());    // drools中如果有参数响应,可以通过字段获取
         catch (Throwable t) 
            t.printStackTrace();
        

  

//KieContainerFactory代码片段
public class KieContainerFactory 

    private static KieContainer kieContainer;

    public static KieContainer getKieContainer() 
        if(kieContainer == null)
            // load up the knowledge base
            KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            kieContainer = kContainer;
        
        return kieContainer;
    

  

5)执行结果,说明代码已经执行到drools文件中,具体的业务逻辑可以在then后的代码块中实现

进来了,消息:hello
从drools中接收到的消息:hello 响应的消息

  

三、动态方式执行

一般指从数据库或者远程获取的规则描述信息,进行规则执行。动态方式不需要kmodule.xml和drl文件,执行上更加简单

public static void execFromDB()
        KieSession kSession = null;
        try 
            // 实际情况从数据库根据code查规则,这里模拟写死
            String rule = "package rules
" +
                    "
" +
                    "import com.beyond.odc.entity.Message;
" +
                    "
" +
                    "rule "hello"
" +
                    "    no-loop true
" +
                    "    lock-on-active true
" +
                    "    when
" +
                    "        $message:Message(status==0)
" +
                    "    then
" +
                    "        System.out.println("动态执行,消息:"+$message.getMessage());
" +
                    "        $message.setResult("hello 响应的消息");
" +
                    "        update($message)
" +
                    "end
" +
                    "
" +
                    "rule "byebye"
" +
                    "    no-loop true
" +
                    "    lock-on-active true
" +
                    "    when
" +
                    "        $message:Message(status==1)
" +
                    "    then
" +
                    "        System.out.println("动态执行,消息:"+$message.getMessage());
" +
                    "        $message.setResult("byebye 响应的消息");
" +
                    "        update($message)
" +
                    "end";

            KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
            kb.add(ResourceFactory.newByteArrayResource(rule.getBytes("utf-8")), ResourceType.DRL);

            // 检查规则正确性
            KnowledgeBuilderErrors errors = kb.getErrors();
            for (KnowledgeBuilderError error : errors) 
                System.out.println("规则文件正确性有误:" + error);
            
            InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
            kBase.addPackages(kb.getKnowledgePackages());

            // 执行规则
            kSession = kBase.newKieSession();
            // fact
            Message fact = new Message();
            fact.setMessage("byebye");
            fact.setStatus(1);
            kSession.insert(fact);
            kSession.fireAllRules();
            System.out.println("从drools规则中接收到的消息:"+fact.getResult());
         catch (Exception e) 
            System.out.println("规则执行异常:"+e);
         finally 
            if (null != kSession)
                kSession.dispose();
        

    

  执行结果如下:

动态执行,消息:byebye
从drools规则中接收到的消息:byebye 响应的消息

  

 

什么时候使用规则引擎drools

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

drools源于规则引擎

...前言     最早对Drools感兴趣,是起源于规则引擎.当时是希望能找一个开源工具来做一些规则的处理.     在官方网站上翻了半天资料,却发现Drools一直在强调它不只是一个简单的规则引擎,而是更... 查看详情

规则引擎drools介绍使用及springboot整合drools(代码片段)

规则引擎Drools介绍、使用及SpringBoot整合Drools一、Drools介绍1.1优点1.2架构1.2.1Drools引擎的核心组件1.2.2规则引擎工作流程简述1.3Drools语法1.3.1规则文件1.3.1.1.规则详情1.属性详情2.条件部分-LHS3.结果部分-RHS1.3.1.2Drools关键词1.3.1.3Drools... 查看详情

java规则引擎--drools

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

几款不错的java规则引擎

以下列举几款不错的规则引擎,方便学习drools很强大的brms系统,同时生态也很不错,问题就是使用上复杂,参考https://github.com/kiegroup/drools&&https://www.drools.org/OpenLTablets参考https://github.com/openl-tablets/openl-tablets,国内资料不是... 查看详情

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

引入maven<dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>7.14.0.Final</version></dependency><dependency>& 查看详情

drools简单应用(代码片段)

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

数据驱动规则引擎 - Drools

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

规则引擎调研(drools和qlexpress)

参考技术A1.问题分析目前存在比较多的判断规则。而且分支逻辑过多,经常出现一些规则判断出现的数据问题。所以需要抽取一些规则条件。利用框架避免问题异常的出现2.框架调研目前常用的规则引擎如下:•常见的规则引... 查看详情

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

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

规则引擎drools6.4.0final版本2

上一篇文章讲了规则引擎的简单版本,可以说是drl配置文件版本,现在将一下数据库版本,这样数据就可以共享,灵活性更加大一些吧,.规则引擎版本1其实原理和上一篇一样,都是一样的模式,今天简单介绍一下,privateKieContainerloadKieContai... 查看详情

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

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

java使用规则引擎drools出现异常

异常如下,但是算出来的数没有问题Exceptioninthread"Thread-16"java.lang.RuntimeException:Classnotconvertibletoprimitive:java.lang.Objectatorg.drools.core.util.ClassUtils.convertToPrimitiveType(ClassUtils.java:378)atorg.drools.rule.constraint.ConditionAnalyzer$AritmeticExpress... 查看详情

决策树和规则引擎 (Drools)

】决策树和规则引擎(Drools)【英文标题】:Decisiontreesandruleengines(Drools)【发布时间】:2011-06-2017:20:33【问题描述】:在我现在正在处理的应用程序中,我需要定期检查数以万计的对象是否符合某种服务的要求。决策图本身采用以... 查看详情

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

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

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

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

使用drools来实现规则引擎

...模式比较重,太耗资源。于是我们打算采用Drools对目前的规则引擎进行改造,以满足边缘侧部署的需求。业务上规则引擎主要包括如下两部分:1、数据转发基于FlinkTableApi&SQL实现,以写SQL的方式,实现IOT平台数据的转发,支持对... 查看详情

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

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