java - Java LinkedList 上的 Drools insertLogical

标签 java list drools

我有一个用Java创建(实例化)的LinkedList,它有几个节点(项目)。 这个列表在 Drools 中也使用,准确地说是由 Drools 修改的。我需要在列表中插入一个新项目,但此插入必须只是临时的。我不知道何时会删除该项目,因此我不得不使用 insertLogical 语句(对吗?)。

这是我的代码,我在名为“lista”的列表中添加了三个“Nodo”项目。 Nodo 是下面的类,它具有构造函数和 set/get 方法:

package com.sample;

public class Nodo {

    private int valore;

    public Nodo(){}

    public Nodo(int valore){
        this.valore=valore;
    }

    public int getValore() {
        return valore;
    }

    public void setValore(int valore) {
        this.valore = valore;
    }

}

这是 java Main 类,它调用 fireAllRules():

package com.sample;

/**
* This is a sample class to launch a rule.
*/

import java.util.LinkedList;
import java.util.List;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;


public class DroolsTest {

public static final void main(String[] args) {
    try {
       // load up the knowledge base
       KieServices ks = KieServices.Factory.get();
       KieContainer kContainer = ks.getKieClasspathContainer();
       KieSession kSession = kContainer.newKieSession("ksession-rules");           

       List<Nodo> lista = new LinkedList();
       Nodo n1 = new Nodo(11);
       Nodo n2 = new Nodo(12);
       Nodo n3 = new Nodo(13);

       lista.add(n1);
       lista.add(n2);
       lista.add(n3);

       kSession.insert(lista);
       kSession.fireAllRules();

       for(Nodo nodo : lista){
           System.out.println( nodo.getValore());
       }

       System.out.println( "End");

    } catch (Throwable t) {
        t.printStackTrace();
    }
}
}

主类的输出是

11 12 13 50

但我真正想要的只是

11 12 13

因为“50”值在 Drools 中逻辑插入,然后立即删除。不会打印“hello”消息,因为 50 项不再在列表中。 (正确,因为列表项已被删除)。

Drools 规则文件如下:

rule "Rule 1"
no-loop true
when
    $l : LinkedList(get(0).getValore() == 11)
then
    Nodo a = new Nodo(50);
    $l.add(0,a);
    insertLogical($l);
end


rule "Rule 2"
no-loop true
when
    $l : LinkedList(get(0).getValore() == 50)
then
    modify($l){remove(0)};
end


rule "Rule 3"
when
    $p: Nodo(valore==50)
then
   System.out.println("hello");
end

我尝试了这种方式,并且确定列表项已从 Drools 工作内存中正确撤回,但 Java 端列表中的项目仍然继续存在。 我想知道为什么列表项仍然存在,如何删除它(不显式销毁)。

这是 LinkedList 的 Drools 问题还是我没有正确理解 insertLogical 的用法?

我还尝试使用不是在 java.util 包中定义的 LinkedList 项,而是在 drools 中定义的“org.drools.core.util.LinkedList”,但编译时出现一些错误。

正确的解决方案是什么?谢谢

最佳答案

Java:有各种类型的对象。它们有自己的方法,并且使用集合(如 LinkedList),您可以调用方法来更改它们的组成,添加或删除元素。

有 Drools:它有一个很大的事实池(工作内存,WM),每个事实都是一个 Java 对象。升级到事实是通过插入操作完成的,并且事实可以通过撤消自动或显式地降级为它的 POJO 存在。

向集合中添加任何内容对于添加的对象是否是事实没有任何影响。相反,插入工作内存或从工作内存中删除都不会改变对象的 Java 风格的存在。

而且,列表是一个对象,它的元素是其他对象。每个对象都小心翼翼地维护自己作为事实的状态,并且集合并不关心其任何元素被提升或降级的两个问题 - 并且您可以打赌,列表元素不会关心其容器是否在集合中。与否 WM。

稍后

规则 1 很奇怪:它的右侧破坏了左侧的真实性,因为在索引 0 处添加了 Nodo(50)。 list 对象,因此逻辑插入的事实不会立即撤回。更奇怪的是:RHS 插入了 WM 中已有的列表对象。

规则 2 永远不会执行,因为规则 1 中的添加不会向引擎发出信号。

规则 3 永远不会执行,因为 Nodo(50) 永远不会作为事实插入。

关于java - Java LinkedList 上的 Drools insertLogical,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24264692/

相关文章:

java - drools 中是否有任何 API 仅通过传递值来动态创建 drl 文件?

java - 在 java 中生成随机数对使得 p !=q

java - "else"不工作

python - 如何挑选打印列表中的第一个数字并将其放入方程式中?

c++ - 为什么需要在列表拼接功能cpp中使用列表参数

python - 获取列表列表中每个元素的索引并制作字典

java - 在 intelliJ 中创建一个 psiElement

java - 只需要在列表中添加父类对象,限制子类对象

java - 光规划器 :Error when displaying constraints scores

java - Drools 中的正则表达式