当前位置: 首页 > 知识库问答 >
问题:

Java Drools-应用了哪些规则和事实列表

汤才捷
2023-03-14

我对口水有点陌生,我想在一个项目中了解更多,所以我在eclipse上用口水做了一个简单的程序。工作流程非常简单,我有一个珠宝产品模型,对于每件珠宝,我根据名称申请一个折扣。

这很好,但我确实希望看到事实列表,以及每个触发规则使用的事实。我有这个:

规则。日间行车灯

package com.rule

import com.javainuse.model.Product
import com.javainuse.model.Counter

rule "Offer for Diamond"
    when 
        productObject: Product(type=="diamond")
    then
        productObject.setDiscount(15);
    end

rule "Offer for Gold"
    when 
        productObject: Product(type=="gold")
    then
        productObject.setDiscount(25);
    end

型号。Product.java

package com.javainuse.model;

public class Product {
    private String type;
    private int discount;

   public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getDiscount() {
        return discount;
    }

    public void setDiscount(int discount) {
        this.discount = discount;
    }
}

主要的DroolsTest。Java语言

package com.javainuse.main;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Collection;
import java.util.Iterator;
import org.drools.compiler.compiler.DroolsParserException;
import org.drools.compiler.compiler.PackageBuilder;
import org.drools.core.FactHandle;
import org.drools.core.RuleBase;
import org.drools.core.RuleBaseFactory;
import org.drools.core.WorkingMemory;
import com.javainuse.model.Product;

public class DroolsTest {

    public static void main(String[] args) throws DroolsParserException,
            IOException {
        DroolsTest droolsTest = new DroolsTest();
        droolsTest.executeDrools();
    }

    public void executeDrools() throws DroolsParserException, IOException {

        PackageBuilder packageBuilder = new PackageBuilder();

        String ruleFile = "/com/rule/Rules.drl";
        InputStream resourceAsStream = getClass().getResourceAsStream(ruleFile);

        Reader reader = new InputStreamReader(resourceAsStream);
        packageBuilder.addPackageFromDrl(reader);
        org.drools.core.rule.Package rulesPackage = packageBuilder.getPackage();
        RuleBase ruleBase = RuleBaseFactory.newRuleBase();
        ruleBase.addPackage(rulesPackage);

        WorkingMemory workingMemory = ruleBase.newStatefulSession();

        Product product = new Product();
        Product product2 = new Product();
        product.setType("gold");
        product2.setType("diamond");

        //List of facts!
        workingMemory.insert(product);
        workingMemory.insert(product2);
        workingMemory.fireAllRules();

System.out.println("Discount for " + product.getType() + " is " + product.getDiscount());

        System.out.println("Discount for " + product2.getType() + " is " + product2.getDiscount());

        //how many facts
        System.out.println("There are " + workingMemory.getFactCount() + " facts");
        //facts handles
        Collection<org.kie.api.runtime.rule.FactHandle> x = workingMemory.getFactHandles();
        System.out.println("Facts Handles: " + x +"\n");

        FactHandle fh;
        Iterator<org.kie.api.runtime.rule.FactHandle> it =  x.iterator();
        while(it.hasNext())
        {
            fh = (FactHandle) it.next();
            System.out.println("FactHandle to string "+fh.toExternalForm().toString());
        }
    }
}

输出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Discount for gold is 25
Discount for diamond is 15
There are 2 facts
Facts Handles: [[fact 0:2:1889057031:1889057031:2:DEFAULT:NON_TRAIT:com.javainuse.model.Product@7098b907], [fact 0:1:93199773:93199773:1:DEFAULT:NON_TRAIT:com.javainuse.model.Product@58e1d9d]]

FactHandle to string 0:2:1889057031:1889057031:2:DEFAULT:NON_TRAIT
FactHandle to string 0:1:93199773:93199773:1:DEFAULT:NON_TRAIT

我想要这样的东西:

Discount for gold is 25
Discount for diamond is 15
There are 2 facts: gold, diamond
gold triggered rule Offer for Gold
diamond triggered Offer for Diamond

有可能吗?我检查了WorkingMemory、Endpoint和FactHandle的类,但什么都没有。

共有3个答案

史经业
2023-03-14

使用drools插件在Eclipse中调试drools规则有多种选项(因为您说过要使用这个IDE)。

考虑使用KieRuntimeLogger获取调试信息。

获得KieSession实例后,可以注册一个新的KieRuntimeLogger:

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

KieRuntimeLogger kieLogger = ks.getLoggers().newFileLogger(kSession, "log");

运行drools应用程序并检查项目文件夹。您将在那里找到日志。日志(原文如此!)包含规则执行期间调用的操作列表的文件

这是关于这一点的详细文章。

孙化
2023-03-14

我找到了一个解决方案,只需检查当规则命中时,事实列表中触发了哪些事实。

>

public void getfacts( WorkingMemory workingMemory )
{
FactHandle fh;
Collection<org.kie.api.runtime.rule.FactHandle> x = workingMemory.getFactHandles();
Iterator<org.kie.api.runtime.rule.FactHandle> it =  x.iterator();

System.out.println("List of facts");
while(it.hasNext())
{
    fh = (FactHandle) it.next();

    Object getobj = workingMemory.getObject(fh);
    //System.out.println("GetObject to string: " + ((Object)getobj));

    if (getobj instanceof RuleFact) {
        System.out.println("\nIt's a Fact: ");
        ((RuleFact) getobj).print();
    }
    //System.out.println("FactHandle to string "+ ((Object) fh.toExternalForm()).toString());
   }

}

输出:

Constructor RuleFact to gold
Constructor RuleFact to diamond
Constructor RuleFact to wood
Inserting facts on the facts list
List of facts

It's a Fact: 
gold

It's a Fact: 
diamond

Fire all the rules
Discount for gold is 95
Discount for diamond is 15
Discount for wood is 0
There are 2 facts
Inserting fact on the facts list
New Rule - fire all the rules
There are 3 facts
Discount for gold is 95
Discount for diamond is 15
Discount for wood is 90
List of facts

It's a Fact: 
wood

It's a Fact: 
gold

It's a Fact: 
diamond
劳高爽
2023-03-14

您可以使用AgendaEventListener在规则匹配时收到通知(以及使其匹配的事实)。

有关更多详细信息,请参阅这篇文章:口水——如何找出所有规则都匹配?

希望有帮助,

 类似资料:
  • 本文向大家介绍使用HTML5需要遵守哪些规则?相关面试题,主要包含被问及使用HTML5需要遵守哪些规则?时的应答技巧和注意事项,需要的朋友参考一下 * 新的特性应该基于HTML、CSS、DOM和JavaScript * 减少对外部插件的需求(如Flash) * 更好的错误处理 * 更多的替换脚本的标记 * HTML5应与设备无关 * 开发过程必须可视化

  • 本文向大家介绍在使用HTML5时有哪些规则需要遵守?相关面试题,主要包含被问及在使用HTML5时有哪些规则需要遵守?时的应答技巧和注意事项,需要的朋友参考一下 使用HTML5需要遵守哪些规则? 新的特性应该基于HTML、CSS、DOM和JavaScript 减少对外部插件的需求(如Flash) 更好的错误处理 更多的替换脚本的标记 HTML5应与设备无关 开发过程必须可视化

  • 我正在向drools会话插入多个事实并在会话上调用fire All规则。如果任何一个事实失败,则会引发异常,并且不会为其余事实执行规则。 我的问题是: 即使有一个事实失败,是否有办法继续执行剩余的事实 //我的scala代码段: 让我知道任何有用的想法。谢谢

  • 这篇文章建议添加一些事实类作为嵌套规则的一种方式。http://drools.46999.n3.nabble.com/How-can-I-nested-rules-td4020488.html#a4020681 我想知道的是——有没有保证“年龄和性别女性”在“怀孕”之前执行,“怀孕”在“怀孕2”之前执行?据我所知,我的申请中总是这样。但是,它是记录在口水留档的某个地方,还是只是等待倒塌的纸牌屋?

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例

  • 1、简单工厂模式 简单工厂模式的本质就是一个工厂类根据传入的参数,动态的决定实例化哪个类。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象。 2、工厂方法模式 应用程序将对象的创建及初始化职责交给工厂对象,工厂Bean。 定义工厂方法,然后通过config.xml配置文件,将其纳入Spring容器来管理,需要通过factory-method指