规则引擎drools6.4.0.final

SDingBa SDingBa     2022-11-22     647

关键词:

java实现规则引擎:
原理不多说,自己查阅资料吧;

搭建环境: maven spring (今天上图 spring框架下搭建规则引擎);

1: maven 依赖;

<dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>$drools-version</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-internal</artifactId>
            <version>$drools-version</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>$drools-version</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>$drools-version</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>$drools-version</version>
        </dependency>

2 person.drl
一看就就明白,当 条件满足时执行then里面的条件语句

package com.sdingba.Drools.demo1;
import com.sdingba.Drools.demo1.person;

rule showdemo
when
    $person : person(age>3)
then
    $person.toString("xxxx");
end

3 person.java

package com.sdingba.Drools.demo1;

/**
 * Created by su on 16-10-27.
 */
public class person 
    private String name;
    private int age;
    private String comment;

    public String getName() 
        return name;
    

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

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public String getComment() 
        return comment;
    

    public void setComment(String comment) 
        this.comment = comment;
    

    public void toString(String s) 
        System.out.println(" id demo :  "+s);
    

4,test.java

package com.sdingba.Drools.demo1;

import com.huitui.extend.entry.ActiveData;
import com.sdingba.SpringTestRoot;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.AgendaFilter;
import org.kie.api.runtime.rule.Match;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

/**
 * Created by su on 16-10-27.
 */
public class demoTest extends SpringTestRoot 
    @Resource
    private KieSession kieSession;

    private static final Logger LOGGER = LoggerFactory.getLogger(demoTest.class);

    @Test
    public void testRules() 
        System.out.println("----start-----");
        person person = new person();
        person.setAge(6);
        kieSession.insert(person);
        kieSession.fireAllRules(new AgendaFilter() 
            @Override
            public boolean accept(Match match) 
                return match.getRule().getName().equals("showdemo");
            
        );

        System.out.println(person.getName());
          System.out.println("----end-----");
    

    @Test
    public void testTimeStamp() 
        LOGGER.info("ts=", System.currentTimeMillis());
    

配置核心类:
DroolsConfig

@Configurable
@Service
public class DroolsConfig implements InitializingBean 

    private Resource[] listRules() throws IOException 
        PathMatchingResourcePatternResolver pmrs = new PathMatchingResourcePatternResolver();
        return pmrs.getResources("classpath*:**/p*.drl");
    

    private KieContainer loadKieContainer() throws IOException 
        KieServices kieService = KieServices.Factory.get();
        final KieRepository kieRepository = kieService.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieFileSystem kfs = kieService.newKieFileSystem();
        Resource[] files = listRules();

        for (Resource file : files) 
            String myString = IOUtils.toString(file.getInputStream(), "UTF-8");

//            InputStream inputStream = new ByteArrayInputStream(s.getBytes());
            String path = "src/main/resources/xxx.drl";
            kfs.write(path, myString );
        

        KieBuilder kieBuilder = kieService.newKieBuilder(kfs);
        kieBuilder.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built.
        return kieService.newKieContainer(kieRepository.getDefaultReleaseId());

    

    @Bean
    @ConditionalOnMissingBean(KieSession.class)
    public KieSession kieSession1() throws IOException 
        return loadKieContainer().newKieSession();
    

    @Bean
    public KieBase kieBase() throws IOException 
        return loadKieContainer().getKieBase();
    
    @Override
    public void afterPropertiesSet() throws Exception 
//        System.out.println(" end -----");
    

以上是代码,
注意事项:
1 pmrs.getResources(“classpath*:*/p.drl”); 这个注意;一定要是resource文件下的(或者资源目录下的).
2,kfs.write(path, myString );中的path可以是任意的xxx.drl
3,spring 框架的环境一定要对,可以不继承InitializingBean
4,上面测试类继承关系如下 :

SpringTestRoot.java

package com.sdingba;

import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

/**
 * Created by su on 16-10-27.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(ServerLauncher.class)
@WebAppConfiguration
public class SpringTestRoot 
    protected static final Logger LOGGER = LoggerFactory.getLogger(SpringTestRoot.class);

ServerLauncher.java

@SpringBootApplication
public class ServerLauncher 
    public static void main(String[] args) 
        SpringApplication.run(ServerLauncher.class, args);
    

测试的依赖:

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

无spring的:

        PathMatchingResourcePatternResolver pmrs = new PathMatchingResourcePatternResolver();
        Resource[] resources = pmrs.getResources("classpath*:**/p*.drl");

        KieServices kieService = KieServices.Factory.get();
        final KieRepository kieRepository = kieService.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieFileSystem kfs = kieService.newKieFileSystem();

        for (Resource file : resources) 
            String myString = IOUtils.toString(file.getInputStream(), "UTF-8");
            String path = "src/main/resources/" + file.getFilename();
            kfs.write(path, myString);
            System.out.println();
        

        KieBuilder kieBuilder = kieService.newKieBuilder(kfs);
        kieBuilder.buildAll();
        KieContainer kieContainer = kieService.newKieContainer(kieRepository.getDefaultReleaseId());



        KieSession kieSession = kieContainer.newKieSession();

        person person = new person();
        person.setAge(6);
        kieSession.insert(person);
        kieSession.fireAllRules();
        System.out.println(person.getName());

什么事规则引擎

规则引擎一、规则引擎概述1.1什么是规则引擎1.2使用规则引擎的优势1.3规则引擎应用场景一、规则引擎概述1.1什么是规则引擎规则引擎,全称为业务规则管理系统,英文名为BRMS(即BusinessRuleManagementSystem)。规则引擎的主要... 查看详情

drrols规则引擎

1.什么是规则引擎?  规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来。规则引擎使用特定的语法编写业务规则,规则引擎可以接受数据输入、解释业务规则、并根据业务规则做出相... 查看详情

旗正商业规则引擎和开源及其它规则引擎测试对比

 规则引擎在基础软件,或者在很多系统中已经不是稀奇的玩意,最近这几年,国内不断兴起很多的规则引擎,至于什么是规则引擎,在这篇文章中,就不做介绍了,我想能看以下内容的,多少对规则引擎也都有所了解了。国... 查看详情

规则引擎选型及简单应用

规则引擎实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程,使用规则引擎可以把复杂、冗余... 查看详情

何时使用业务规则引擎

】何时使用业务规则引擎【英文标题】:WhenisaBusinessRulesEngineused【发布时间】:2010-10-2103:37:24【问题描述】:什么时候使用业务规则引擎?业务规则引擎和脚本/配置/定制有什么区别【问题讨论】:【参考方案1】:当您尝试在代... 查看详情

规则引擎用户界面设计

】规则引擎用户界面设计【英文标题】:RulesEnginesUserInterfaceDesign【发布时间】:2010-12-2604:02:09【问题描述】:在工作中,我们有优化引擎,这些引擎使用的输入之一是业务规则,我们使用专有的规则编辑器创建和编辑。这些规... 查看详情

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

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

java规则引擎及jsr-94[转]

规则引擎简介     Java规则引擎是推理引擎的一种,它起源于基于规则的专家系统。     Java规则引擎将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。Java规则引... 查看详情

我应该使用啥规则引擎? [关闭]

】我应该使用啥规则引擎?[关闭]【英文标题】:WhatruleengineshouldIuse?[closed]我应该使用什么规则引擎?[关闭]【发布时间】:2010-09-0514:48:54【问题描述】:有哪些最好或最受欢迎的规则引擎?我还没有确定编程语言,所以告诉我... 查看详情

drools开源规则引擎比较难上手,有没有一款容易上手的规则引擎?

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

关于规则引擎的神话是啥? [关闭]

】关于规则引擎的神话是啥?[关闭]【英文标题】:Whatarethemythsaboutrulesengine?[closed]关于规则引擎的神话是什么?[关闭]【发布时间】:2011-05-0610:36:33【问题描述】:我正在写一篇关于规则引擎技术的演示文稿,特别是JBossDrools。... 查看详情

如何设计规则引擎?

】如何设计规则引擎?【英文标题】:Howtodesignaruleengine?【发布时间】:2010-09-1017:24:18【问题描述】:我应该在C#中创建一个简单的规则引擎。关于我如何继续进行的任何线索?它是一个简约的规则引擎,并将使用SQL服务器作为... 查看详情

实施规则引擎的指南

】实施规则引擎的指南【英文标题】:Guidelinesforimplementingaruleengine【发布时间】:2011-07-1321:02:14【问题描述】:实施您自己的规则引擎而不是使用现有的商业/开源引擎的原因可能是什么?实现规则引擎的任何具体指南?【问题... 查看详情

具有良好接口的开源规则引擎,用于编写规则

】具有良好接口的开源规则引擎,用于编写规则【英文标题】:Opensourcerulesenginewithdecentinterfaceforwritingrules【发布时间】:2010-09-0612:16:54【问题描述】:我正在尝试找到一个开源业务规则引擎,该引擎具有用于构建规则的良好界... 查看详情

规则引擎的应用

java开源的规则引擎有:Drools、EasyRules、Mandarax、IBMILOG。使用最为广泛并且开源的是Drools。     规则引擎的优点声明式编程规则可以很容易地解决困难的问题,并得到解决方案的验证。与代码不同,规则以较不复杂的语... 查看详情

什么时候不应该使用规则引擎? [关闭]

】什么时候不应该使用规则引擎?[关闭]【英文标题】:WhenshouldyouNOTuseaRulesEngine?[closed]【发布时间】:2010-10-2023:36:15【问题描述】:我有一个相当不错的使用规则引擎的优点列表,以及使用它们的一些原因,我需要的是你不应该... 查看详情

flink规则引擎实践分享(代码片段)

Flink规则引擎实践分享文章目录Flink规则引擎实践分享一、实时规则引擎架构***二、规则抽象模型三、规则、条件查询封装**3.1规则封装3.2查询规则封装四、基于ClickHouse实现用户行为明细查询服务支持4.1ClickHouse从Kafka摄取数据4.2Cl... 查看详情

规则引擎

参考技术A规则引擎drools的rete算法实现原理和事实匹配过程https://cloud.tencent.com/developer/article/1477434随笔分类-策略算法和规则引擎https://www.cnblogs.com/shangxiaofei/category/759910.htmlProductionMatchingForLargeLearningSystemshttp://reports-archive.adm.cs.cmu.... 查看详情