精华内容
下载资源
问答
  • drool

    2008-03-10 11:01:49
    the introduce to the rule engine! especial for java1
  • drool, 自动内存泄漏检测和分析
  • Drool规则引擎入门 源码地址 https://gitee.com/ergo9527/drool-demo.git 工作流程 引擎启动后,首先进行编译工作,就是把我们定义好的rule加载到Production memory中,我们也可以把这个过程称为"构建知识库...

    Drool规则引擎入门

    源码地址
    https://gitee.com/ergo9527/drool-demo.git

    工作流程

    引擎启动后,首先进行编译工作,就是把我们定义好的rule加载到Production memory中,我们也可以把这个过程称为"构建知识库(knowledgeBuilder)";当我们的业务系统生成新的数据并传入到引擎,引擎把这些数据作为fact存储进Working memory;接着引擎开始"模式匹配(pattern matching)"工作,即对Working memory中的fact,匹配rule的condition项,如果匹配了,那么把这个rule加入到Agenda里面;最后是真正的执行操作,引擎会对Agenda里的rule按照优先级进行序列安排,然后执行rule定义好的action操作![img](Drool规则引擎手册

    Drool入门Demo1.0

    1.引入相关依赖

    	<!-- Drools -->
        <dependency>
          <groupId>org.kie</groupId>
          <artifactId>kie-api</artifactId>
          <version>7.32.0.Final</version>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-core</artifactId>
          <version>7.32.0.Final</version>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-compiler</artifactId>
          <version>7.32.0.Final</version>
        </dependency>
        <dependency>
          <groupId>org.kie</groupId>
          <artifactId>kie-ci</artifactId>
          <version>7.32.0.Final</version>
        </dependency>
    

    2.创建实体类

    bean对象在规则引擎中就是Fact,用于去匹配规则的condition

    @Data
    @Builder
    public class Account {
    
        /**
         * 开户人
         */
        private String name;
    
        /**
         * 账户余额 单位:万元
         */
        private Double money;
    
        /**
         * 账户类型:
         * 黑卡:  [100-∞)万
         * 钻卡:  [50-100)万
         * 金卡:  [10-50)万
         * 普卡:  [0-10)万
         */
        private String accountType;
    

    3.编写规则文件

    在resources下创建一个rules文件夹用于放规则文件,规则文件可以使用 .drl文件,也可以是xml文件,这里我们使用drl文件。

    示例代码

    package drools.demos.rules.ruledemo1
    
    import com.lx.entity.Account
    
    /*普卡账户判断*/
    rule "account-rating-normal"
    when
    account: Account(money>=0,money<10)
    then
    account.setAccountType("普卡");
    System.out.println("【"+account.getName()+"】为【"+account.getAccountType()+"】用户,当前可用余额为: "+account.getMoney()+" 万元");
    System.out.println("=====存入10万元=====");
    account.setMoney(account.getMoney()+10.0);
    update(account);
    end
    
    /*金卡账户判断*/
    rule "account-rating-gold"
    when
    account: Account(money>=10,money<50)
    then
    account.setAccountType("金卡");
    System.out.println("【"+account.getName()+"】为【"+account.getAccountType()+"】用户,当前可用余额为: "+account.getMoney()+" 万元");
    System.out.println("=====存入50万元=====");
    account.setMoney(account.getMoney()+50.0);
    update(account);
    end
    
    /*钻卡账户判断*/
    rule "account-rating-diamond"
    when
    account: Account(money>=50,money<100)
    then
    account.setAccountType("钻卡");
    System.out.println("【"+account.getName()+"】为【"+account.getAccountType()+"】用户,当前可用余额为: "+account.getMoney()+" 万元");
    System.out.println("=====存入50万元=====");
    account.setMoney(account.getMoney()+50.0);
    update(account);
    end
    
    /*黑卡账户判断*/
    rule "account-rating-black"
    no-loop true
    when
    account: Account(money>=100)
    then
    account.setAccountType("黑卡");
    System.out.println("【"+account.getName()+"】为【"+account.getAccountType()+"】用户,当前可用余额为: "+account.getMoney()+" 万元");
    System.out.println("=====存入50万元=====");
    account.setMoney(account.getMoney()+50.0);
    update(account)
    end
    

    4.编写配置文件

    在resources下创建一个META-INF(命名固定)文件夹用于放配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <kmodule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://www.drools.org/xsd/kmodule">
        <kbase name="rules1" packages="drools.demos.rules.ruledemo1">
            <ksession name="ruledemo1"/>
        </kbase>
    </kmodule>
    
    

    kbase结点用于配置规则库或知识库的信息,这里我们指定了一个指向drools.demos.rules.ruledemo1的名为rules1的kbase结点,意思就是这个rules1结点将使用我们在ruledemo1.drl里定义好的规则(ruledemo1.drl里定义的package名就是drools.demos.rules.ruledemo1)来构建知识库;kbase结点下又配置了一个名为ruledemo1的ksession结点,ksession代表了运行时的执行会话,可以在一个kbase下指定多个不同参数的session

    5.编写主函数

    public class Application {
        public static void main(String[] args) {
            KieServices ks = KieServices.Factory.get();
            KieContainer kieContainer = ks.getKieClasspathContainer();
            KieSession kieSession = kieContainer.newKieSession("ruledemo1");//就是kmodule.xml里定义的那个ksession
    
            Account account = Account.builder().name("刘二狗").accountType("").money(9.90).build();
    
            kieSession.insert(account);//把这个Fact传入
            kieSession.fireAllRules();//开始规则检验
        }
    

    6.运行并观察结果

    【刘二狗】为【普卡】用户,当前可用余额为: 9.9 万元
    =====存入10万元=====
    【刘二狗】为【金卡】用户,当前可用余额为: 19.9 万元
    =====存入50万元=====
    【刘二狗】为【钻卡】用户,当前可用余额为: 69.9 万元
    =====存入50万元=====
    【刘二狗】为【黑卡】用户,当前可用余额为: 119.9 万元
    =====存入50万元=====
    
    展开全文
  • Drool中文使用文档

    2011-08-29 08:49:54
    Drool中文详解,比较详细,官方的使用的文档,版本:4.0
  • Spring Boot Drool规则引擎 Spring Boot Drool应用程序支持动态加载规则而无需停止应用程序 Cahce规则会话使用REST API加载规则 问题陈述 集中规则引擎以支持全球市场 功能支持如果任何规则引擎规则应反映在系统中○...
  • 整理一下jboss drool5.1中文使用说明,doc格式
  • DROOL 5分钟上手Case

    千次阅读 2017-08-17 18:23:28
    DROOL确实是相当庞大的一个项目,对于初学者来说如何快速上手使用,着实还是一个比较困难的事情。这里提供了源码中的例子,使得你可以快速地在五分钟内上手实战。String drl1 = "global java.util.List list\n" + ...

    DROOL确实是相当庞大的一个项目,对于初学者来说如何快速上手使用,着实还是一个比较困难的事情。这里提供了源码中的例子,使得你可以快速地在五分钟内上手实战。

    String drl1 = "global java.util.List list\n" +
      "rule R1 when\n" +
      "  $s : String()\n" +
      "  $i : Integer( this == $s.length() )\n" +
      "  $j : Integer( this == $i * 2 )\n" +
      "then\n" +
      "  list.add( $j );\n" +
      "end\n";
    String drl2 = "global java.util.List list\n" +
      "rule R2 when\n" +
      "  $s : String()\n" +
      "  $i : Integer( this == $s.length() )\n" +
      "  $j : Integer( this == $i * 3 )\n" +
      "then\n" +
      "  list.add( $j );\n" +
      "end\n";
    //创建内部规则库(很有意思:这明明就是知识库)
    InternalKnowledgeBase kbase = (InternalKnowledgeBase)getKnowledgeBase( );
    //添加文本串的规则 R1
    kbase.addPackages(loadKnowledgePackagesFromString( drl1 ));
    //创建会话
    KieSession ksession = createKnowledgeSession(kbase);
    //向引擎添加一个全局的list,注意看规则中的第一行描述-global java.util.List list
    List<Integer> list = new ArrayList<Integer>();
    ksession.setGlobal("list", list);
    //添加四条事实数据
    ksession.insert("test");
    ksession.insert(4);
    ksession.insert(8);
    ksession.insert(12);
    //好了,可以点火了——出发规则引擎
    ksession.fireAllRules();
    //于是我们便得到了保存在list中的结果
    assertEquals(8, (int)list.get(0));
    list.clear();
    //添加一条新规则
    kbase.addPackages(loadKnowledgePackagesFromString(drl2));
    //删除原有的老规则
    kbase.removeRule("defaultpkg", "R1");
    //再次点火
    ksession.fireAllRules();
    //结果便来了
    assertEquals(12, (int)list.get(0));

    快速解读:上边演示了如何添加、删除字符串规则和基本的过程。有人不禁要问事实数据可以动态删除或修改么?没有问题的,看这个例子:

    //添加事实数据
    FactHandle handler = ksession.insert(12);
    //变更事实数据
    ksession.update(handler, 13);
    //删除事实数据
    ksession.delete(handler);

    嗯,似乎差不多了。还差点什么,下边这三个关键的函数。

    KieBase getKnowledgeBase() {
      KieBaseConfiguration kBaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
      return getKnowledgeBase(kBaseConfig);
    }    
    
    KieBase getKnowledgeBase(KieBaseConfiguration kBaseConfig) {
      KieBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kBaseConfig);
      try {
        kbase = SerializationHelper.serializeObject(kbase, ((InternalKnowledgeBase) kbase).getRootClassLoader());
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
      return kbase;
    }
    public Collection<KiePackage> loadKnowledgePackagesFromString(String... content) {
      return loadKnowledgePackagesFromString(null, content);
    }
    
    public Collection<KiePackage> loadKnowledgePackagesFromString(KnowledgeBuilderConfiguration kbuilderConf, String... content) {
      if (kbuilderConf == null) {
        kbuilderConf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
      }
      KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbuilderConf);
      for (String r : content) {
             kbuilder.add(ResourceFactory.newByteArrayResource(r.getBytes()),ResourceType.DRL);
      }
      if (kbuilder.hasErrors()) {
        fail(kbuilder.getErrors().toString());
      }
      Collection<KiePackage> knowledgePackages = kbuilder.getKnowledgePackages();
      return knowledgePackages;
    }
    KieSession createKnowledgeSession(KieBase kbase) {
      return kbase.newKieSession();
    }

    嗯,这次差不多了,可以移植去使用了。(完)

    展开全文
  • drool 7.x 属性 : no-loop

    千次阅读 2018-09-28 15:21:19
    drool 7.x 属性 : no-loop

    在这里插入图片描述

    drool 7.x 属性 : no-loop
    测试类参考:https://blog.csdn.net/qq_21383435/article/details/82872537
    实体类:com.secbro.drools.model.Product
    规则:/Users/lcc/IdeaProjects/AllTest/drools_test7/src/main/resources/rules.blog/noLoopSession.drl

    package rules.blog
    
    import com.secbro.drools.model.Product;
    
    rule "updateDistcount"
    	// 设置为false
        no-loop false
        when
            productObj:Product(discount > 0);
        then
            // 符合就将Discount自增1
            productObj.setDiscount(productObj.getDiscount() + 1);
            System.out.println(productObj.getDiscount());
            update(productObj);
        end
    
    

    /Users/lcc/IdeaProjects/AllTest/drools_test7/src/main/resources/META-INF/kmodule.xml中添加,指定kesession加载的是哪个包(rules.blog)下面的规则

        <kbase name="rules3"  packages="rules.blog" >
            <ksession name="noLoopSession"/>
        </kbase>
    
    

    测试类:com.test.TestRules#testRules1

     /**
         * 测试博客上的 no-loop 属性
         */
        @Test
        public void testRules1() {
            // 构建KieServices
            KieServices ks = KieServices.Factory.get();
            KieContainer kieContainer = ks.getKieClasspathContainer();
            // 获取kmodule.xml中配置中名称为ksession-rule的session,默认为有状态的。
            KieSession kSession = kieContainer.newKieSession("noLoopSession");
    
            Product product = new Product();
            product.setType(Product.GOLD);
            product.setDiscount(10);
    
            kSession.insert(product);
            int count = kSession.fireAllRules();
            System.out.println("命中了" + count + "条规则!");
            System.out.println("商品" +product.getType() + "的商品折扣为" + product.getDiscount() + "%。");
    
            kSession.dispose();
    
        }
    
    

    运行结果:

    11
    12
    13
    14
    15
    。。。。。无限循环
    

    将上面的no-loop false改为no-loop true结果为

    11
    命中了1条规则!
    商品GOLD的商品折扣为11%。
    

    可以看到是否循环,执行此条规则时就会发现程序进入了死循环。也就是说对传入当前workingMemory中的FACT对象的属性进行修改,并调用update方法就会重新触发规则。从打印的结果来看,update之后被修改的数据已经生效,在重新执行规则时并未被重置。当然对Fact对象数据的修改并不是一定需要调用update才可以生效,简单的使用 set 方法设置就可以完成,但仅仅调用set方法时并不会重新触发规则。所以,对insert、retract、update方法使用时一定要慎重,否则极可能会造成死循环。

    设置no-loop为true来避免规则的重新触发,同时,如果本身的RHS部分有insert、retract、update等触发规则重新执行的操作,也不会再次执行当前规则。

    上面的设置虽然解决了当前规则的不会被重复执行,但其他规则还是会收到影响,比如下面的例子:

    package com.rules
    
    import com.secbro.drools.model.Product;
    
    rule updateDistcount
        no-loop true
        when
            productObj:Product(discount > 0);
        then
            productObj.setDiscount(productObj.getDiscount() + 1);
            System.out.println(productObj.getDiscount());
            update(productObj);
        end
    
    rule otherRule
        when
        productObj : Product(discount > 1);
        then
        System.out.println("被触发了" + productObj.getDiscount());
        end
    

    此时执行会发现,当第一个规则执行update方法之后,规则otherRule也会被触发执行。如果注释掉update方法,规则otherRule则不会被触发。那么,这个问题是不是就没办法解决了?当然可以,那就是引入lock-on-active true属性。

    展开全文
  • 学习Drool随感

    2008-08-01 18:17:00
    Drool规则引擎的建议阅读,脑海里瞬间闪过的念头: 旧时王谢堂前燕,飞入寻常百姓家. 但是显然不是原意了,呵呵.感慨知识在互联网时代分享和普及,挺好.贴一个链接,目前看到的讲解Drool的切入点和深度很适合首次接触规则...
     Drool规则引擎的建议阅读,脑海里瞬间闪过的念头: 旧时王谢堂前燕,飞入寻常百姓家. 但是显然不是原意了,呵呵.

    感慨知识在互联网时代分享和普及,挺好.贴一个链接,目前看到的讲解Drool的切入点和深度很适合首次接触规则引擎的(myself, ;-)):

    http://www.onjava.com/pub/a/onjava/2005/08/03/drools.html

    Recommended Reading

    Books

    Jess in Action: Java Rule-based Systems
    Ernest Friedman-Hill
    ISBN: 1930110898

    Expert Systems: Principles and Programming
    Joseph Giarratano, Gary D. Riley
    ISBN: 0534384471

    Introduction to Expert Systems
    Peter Jackson
    ISBN: 0201876868

    Business Rules and Information Systems: Aligning IT with Business Goals
    Tony Morgan
    ISBN: 0201743914

    Principles of the Business Rule Approach
    Ronald G. Ross
    ISBN: 0201788934

    Business Rules Applied
    Von Halle
    ISBN: 0471412937

    Papers

    Rete: A fast algorithm for the many pattern/many object pattern match problem
    by Charles L. Forgy
    Artificial Intelligence, Volume 19, Issue 1, September 1982, Pages 17-37

    Production Matching for Large Learning Systems (Rete/UL)
    by Robert B. Doorenbos
    PhD thesis, Carnegie Mellon University, January 31, 1995

    The LEAPS Algorithms
    by Don Batory
    Technical Report 94-28, Department of Computer Sciences, University of Texas at Austin, 1994 
    展开全文
  • drool就是用java语言开发的规则引擎插件,规则引擎的原理就是Rete算法。 Rete算法是Charles Forgy在1979年的论文中首次提出的,针对基于规则知识表现的模式匹配算法。 什么是业务规则?就是当发生了X后,执行Y...
  • Drool最新 中文文档

    2019-01-02 14:53:53
    Drools 7.0 官方中文文档 ,讲解超级全面 ,由浅入深,带你了解所有的jbools
  • drool的jar包

    2018-09-21 15:22:25
    Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。
  • Drool规则引擎介绍

    千次阅读 2019-11-15 18:52:27
  • 本文是介绍drool7s kmodule。一、为什么komdule.xml文件一定要放在resources下的META-INF文件夹中---》直接看源码吧,请看下图,应该都知道为什么要放在固定文件夹下。二、下面是一些知识点,需要大家记住的kmodule...
  • Drool资料大全

    2012-08-28 13:15:08
    Drools技术开发文档大全,详细入门
  • Drool规则引擎在实现业务逻辑中的应用.pdf
  • KIE是缩写,knowledge is ...另外关于drool7s的生命周期,请看下图本文只是让你了解drools7的一些概念,也是开始实践的基础。如果不了解这些知识的话,之后可能要回来看看就可以了,这样做应该比较更加容易理解。...
  • drool基本规则

    千次阅读 2018-06-10 09:14:04
  • Drool的测试程序

    2014-09-19 10:24:29
    Drools规则引擎的测试程序,适合初学者
  • Drool的global变量

    2019-05-22 16:44:12
    global变量可以记录要返回的结果。 drl文件中如何使用: import com.blackfish.demo.drools.OutputDisplay; global OutputDisplay outputDisplay; rule "rule1" salience 2 when $stu:Stu(age >... ...
  • drool-jbrms.war的部署

    2008-07-04 10:50:02
    环境JDK1.5 jboss web server 1.0.1 或者 JBoss Application Server 4.0.5 将drool-jbrms.war拷贝到目录:..\server\default\deploy 就可以进入管理规则界面了。
  • <div><p>该提问来源于开源项目:kiegroup/drools</p></div>
  • Drool的LHS和RHS

    2019-05-22 16:41:56
    LHS:Left Hand Side,在Rete网络的左边部分,即规则的when部分。 RHS:Right Hand Side,在Rete网络的右边部分,即规则的then部分,可以用纯java代码写。 rule "rule4" salience 4 when $stu:Stu(getName() == ...
  • Drool的学习资料

    2016-07-07 15:50:58
    https://github.com/droolsjbpm http://docs.jboss.org/drools/release/6.4.0.Final/drools-docs/html_single/index.html http://www.360doc.com/content/15/0301/18/6789490_451782046.shtml

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 158
精华内容 63
热门标签
关键字:

drool