Java Drools规则在3次后未被触发

Java Drools规则在3次后未被触发,java,drools,Java,Drools,我创建了一个知识库,然后在一个循环中使用知识库来创建 无状态知识会话 并在会话上调用execute,在每次迭代中使用相同的数据 -----这里是主要功能------ 对于每个迭代,都使用相同的数据来执行会话,所以预期会执行相同的规则集,但我观察到,在一些迭代之后,没有触发任何规则 以下是每个迭代的控制台输出: Iteration number: 0 Rule Fired Rule Fired Rule Fired Rule Fired Rule Fired Rule Fired Rule

我创建了一个知识库,然后在一个循环中使用知识库来创建

  • 无状态知识会话
  • 并在会话上调用execute,在每次迭代中使用相同的数据
-----这里是主要功能------


对于每个迭代,都使用相同的数据来执行会话,所以预期会执行相同的规则集,但我观察到,在一些迭代之后,没有触发任何规则

以下是每个迭代的控制台输出:

Iteration number: 0
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Iteration number: 1
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Iteration number: 2
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Rule Fired
Iteration number: 3
Iteration number: 4
Iteration number: 5
Iteration number: 6
Iteration number: 7
Iteration number: 8
Iteration number: 9
一些意见:

  • 在每个规则中,我都有$componentList进行匹配,当我们减少组件列表中的组件数量时,需要更多的迭代才能达到不触发任何规则的情况

  • 当我们将规则文件中的条件更改为simple(如下所述)时,每个迭代都会生成相同的输出

    $component:$componentList中的组件(类型==“磁盘”)

这看起来像是流口水、某种内存或数据结构损坏的问题

我也尝试过statefull会话,看到了相同的行为

我是不是遗漏了什么?我的理解是知识库是只读的,我们可以从中创建任意数量的会话

这里使用的是5.6.0.Final版本,我们也尝试过drools 6.1.0,但看到了相同的行为

由于这个问题,我被困住了,非常感谢您的帮助

如果你想重现这个问题,下面的类定义会有所帮助

MainClass.java
    package com.test
    import com.test.CollectorPluginData;
    import com.test.Component;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;

    import org.drools.KnowledgeBase;
    import org.drools.KnowledgeBaseFactory;
    import org.drools.builder.KnowledgeBuilder;
    import org.drools.builder.KnowledgeBuilderFactory;
    import org.drools.builder.ResourceType;
    import org.drools.io.ResourceFactory;
    import org.drools.runtime.StatelessKnowledgeSession;

    public class MainClass
    {
      public static final void main(String[] args)
      {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("diskRules.drl"), ResourceType.DRL);
        if (kbuilder.hasErrors())
        {

          System.err.println(kbuilder.getErrors().toString());

        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

        CollectorPluginData cpd = getData();

        for (int i = 0; i < 10; i++)
        {

          System.out.println("Iteration number: " + i);
          StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();

          ksession.execute(cpd);
        }
      }

      public static CollectorPluginData getData()
      {

        CollectorPluginData cpd = new CollectorPluginData();

        cpd.setPluginName("DiskCollectorPlugin");

        List<Component> components = getDiskComponets("Online", 5);
        components.addAll(getDiskComponets("Unconfigured Good", 5));
        components.addAll(getDiskComponets("Unconfigured Bad", 5));
        components.addAll(getDiskComponets("Offline", 5));
        components.addAll(getDiskComponets("Failed", 5));
        cpd.setComponentList(components);

        return cpd;

      }

      private static List<Component> getDiskComponets(String status, int num)
      {
        List<Component> components = new ArrayList<Component>();
        int enclosure = new Random().nextInt();
        for (int i = 0; i < num; i++)
        {
          Component c = new Component();
          c.setType("Disk");
          c.setName("Enclosure " + enclosure + " Disk " + String.valueOf(i + 1));
          c.setId(enclosure + "_" + String.valueOf(i + 1));
          c.setproperty("isSupported", 1);
          c.setproperty("pdMediaType", "Rotating Media, HDD");
          c.setproperty("mediaErrorCount", 0);
          c.setproperty("scsiDeviceType", "Disk");
          c.setproperty("lastFailedPredEventSeqNum", 0);
          c.setproperty("currentComponentState", status);
          c.setproperty("otherErrorCount", 0);
          c.setproperty("isGlobalHotSpare", 0);
          c.setproperty("isForcedPdGuid", 0);
          c.setproperty("maxSupportedSpeed", "6G");
          c.setproperty("isDedicatedHotSpare", 0);
          c.setproperty("isForeign", 0);
          c.setproperty("predFailCount", 0);
          c.setproperty("driveReadyForRemoval", 0);
          c.setproperty("linkSpeed", 3);
          c.setproperty("isPdInVd", 0);
          c.setproperty("pdDeviceType", "SAS");
          c.setproperty("rawSize", 1953525168);
          c.setproperty("enclosureId", 252);
          c.setproperty("nonCoercedSize", 1952476592);
          c.setproperty("coercedSize", 1951170560);
          c.setproperty("temperatureInCelsius", 255);
          c.setproperty("slotNumber", 2);
          c.setproperty("pdPowerState", "Spun Down");
          c.setproperty("shieldCounter", 0);
          c.setproperty("shieldDiagCompletionTime", "0000-00-00T00:00:00");
          components.add(c);
        }
        return components;
      }
    }
MainClass.java
包com.test
导入com.test.CollectorPluginData;
导入com.test.Component;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Random;
导入org.drools.KnowledgeBase;
导入org.drools.KnowledgeBaseFactory;
导入org.drools.builder.KnowledgeBuilder;
导入org.drools.builder.KnowledgeBuilderFactory;
导入org.drools.builder.ResourceType;
导入org.drools.io.ResourceFactory;
导入org.drools.runtime.KnowledgeSession;
公共类主类
{
公共静态最终void main(字符串[]args)
{
KnowledgeBuilder kbuilder=KnowledgeBuilderFactory.newKnowledgeBuilder();
添加(ResourceFactory.newClassPathResource(“diskRules.drl”)、ResourceType.drl);
if(kbuilder.hasErrors())
{
System.err.println(kbuilder.getErrors().toString());
}
KnowledgeBase kbase=KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
CollectorPluginData cpd=getData();
对于(int i=0;i<10;i++)
{
System.out.println(“迭代编号:+i”);
无状态知识会话ksession=kbase.newStatelessKnowledgeSession();
K会话执行(cpd);
}
}
公共静态收集器PluginData getData()
{
CollectorPluginData cpd=新的CollectorPluginData();
cpd.setPluginName(“DiskCollectorPlugin”);
列出组件=getDiskComponets(“联机”,5);
addAll(getDiskComponets(“未配置好”,5));
addAll(getDiskComponets(“unconfigurated Bad”,5));
addAll(getDiskComponets(“脱机”,5));
addAll(getDiskComponets(“Failed”,5));
cpd.setComponentList(组件);
返回cpd;
}
私有静态列表getDiskComponets(字符串状态,int num)
{
List components=new ArrayList();
int enclosure=new Random().nextInt();
for(int i=0;i
Component.java

 package com.test;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import java.util.HashMap;
import java.util.Map;

public class Component
{
  protected String type;
  protected String id; 
  protected String name; 

  protected Map<String, Object> properties;

  public String getType()
  {
    return type;
  }

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

  public Map<String, Object> getProperties()
  {
    return properties;
  }

  public void setProperties(Map<String, Object> properties)
  {
    this.properties = properties;
  }

  public void setproperty(String key, Object value)
  {
    if (this.properties == null)
    {
      this.properties = new HashMap<String, Object>();
    }

    this.properties.put(key, value);

  }

  public Component()
  {
    super();

  }

  public Component(String type, String id, int status)
  {

    this.type = type;
    this.id = id;
    setproperty("status", status);

  }

  public String getId()
  {
    return id;
  }

  public void setId(String id)
  {
    this.id = id;
  }

  public String getName()
  {
    return name;
  }

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

}
package.com.test;
导入com.fasterxml.jackson.annotation.JsonIgnoreProperties;
导入com.fasterxml.jackson.annotation.JsonInclude;
导入com.fasterxml.jackson.annotation.JsonInclude.Include;
导入java.util.HashMap;
导入java.util.Map;
公共类组件
{
保护字符串类型;
受保护的字符串id;
受保护的字符串名称;
受保护的地图属性;
公共字符串getType()
{
返回类型;
}
公共void集合类型(字符串类型)
{
this.type=type;
}
公共映射getProperties()
{
归还财产;
}
公共void集合属性(映射属性)
{
这个。属性=属性;
}
公共void setproperty(字符串键、对象值)
{
if(this.properties==null)
{
这
MainClass.java
    package com.test
    import com.test.CollectorPluginData;
    import com.test.Component;

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;

    import org.drools.KnowledgeBase;
    import org.drools.KnowledgeBaseFactory;
    import org.drools.builder.KnowledgeBuilder;
    import org.drools.builder.KnowledgeBuilderFactory;
    import org.drools.builder.ResourceType;
    import org.drools.io.ResourceFactory;
    import org.drools.runtime.StatelessKnowledgeSession;

    public class MainClass
    {
      public static final void main(String[] args)
      {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("diskRules.drl"), ResourceType.DRL);
        if (kbuilder.hasErrors())
        {

          System.err.println(kbuilder.getErrors().toString());

        }

        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

        CollectorPluginData cpd = getData();

        for (int i = 0; i < 10; i++)
        {

          System.out.println("Iteration number: " + i);
          StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();

          ksession.execute(cpd);
        }
      }

      public static CollectorPluginData getData()
      {

        CollectorPluginData cpd = new CollectorPluginData();

        cpd.setPluginName("DiskCollectorPlugin");

        List<Component> components = getDiskComponets("Online", 5);
        components.addAll(getDiskComponets("Unconfigured Good", 5));
        components.addAll(getDiskComponets("Unconfigured Bad", 5));
        components.addAll(getDiskComponets("Offline", 5));
        components.addAll(getDiskComponets("Failed", 5));
        cpd.setComponentList(components);

        return cpd;

      }

      private static List<Component> getDiskComponets(String status, int num)
      {
        List<Component> components = new ArrayList<Component>();
        int enclosure = new Random().nextInt();
        for (int i = 0; i < num; i++)
        {
          Component c = new Component();
          c.setType("Disk");
          c.setName("Enclosure " + enclosure + " Disk " + String.valueOf(i + 1));
          c.setId(enclosure + "_" + String.valueOf(i + 1));
          c.setproperty("isSupported", 1);
          c.setproperty("pdMediaType", "Rotating Media, HDD");
          c.setproperty("mediaErrorCount", 0);
          c.setproperty("scsiDeviceType", "Disk");
          c.setproperty("lastFailedPredEventSeqNum", 0);
          c.setproperty("currentComponentState", status);
          c.setproperty("otherErrorCount", 0);
          c.setproperty("isGlobalHotSpare", 0);
          c.setproperty("isForcedPdGuid", 0);
          c.setproperty("maxSupportedSpeed", "6G");
          c.setproperty("isDedicatedHotSpare", 0);
          c.setproperty("isForeign", 0);
          c.setproperty("predFailCount", 0);
          c.setproperty("driveReadyForRemoval", 0);
          c.setproperty("linkSpeed", 3);
          c.setproperty("isPdInVd", 0);
          c.setproperty("pdDeviceType", "SAS");
          c.setproperty("rawSize", 1953525168);
          c.setproperty("enclosureId", 252);
          c.setproperty("nonCoercedSize", 1952476592);
          c.setproperty("coercedSize", 1951170560);
          c.setproperty("temperatureInCelsius", 255);
          c.setproperty("slotNumber", 2);
          c.setproperty("pdPowerState", "Spun Down");
          c.setproperty("shieldCounter", 0);
          c.setproperty("shieldDiagCompletionTime", "0000-00-00T00:00:00");
          components.add(c);
        }
        return components;
      }
    }
 package com.test;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import java.util.HashMap;
import java.util.Map;

public class Component
{
  protected String type;
  protected String id; 
  protected String name; 

  protected Map<String, Object> properties;

  public String getType()
  {
    return type;
  }

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

  public Map<String, Object> getProperties()
  {
    return properties;
  }

  public void setProperties(Map<String, Object> properties)
  {
    this.properties = properties;
  }

  public void setproperty(String key, Object value)
  {
    if (this.properties == null)
    {
      this.properties = new HashMap<String, Object>();
    }

    this.properties.put(key, value);

  }

  public Component()
  {
    super();

  }

  public Component(String type, String id, int status)
  {

    this.type = type;
    this.id = id;
    setproperty("status", status);

  }

  public String getId()
  {
    return id;
  }

  public void setId(String id)
  {
    this.id = id;
  }

  public String getName()
  {
    return name;
  }

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

}
package com.test;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import java.util.ArrayList;
import java.util.List;

public class CollectorPluginData
{
  private String pluginName;
  private String timeStamp;
  private String hostName;
  private String serialNumber;
  private String model;
  private List<Component> componentList;

  public String getSerialNumber()
  {
    return serialNumber;
  }

  public void setSerialNumber(String serialNumber)
  {
    this.serialNumber = serialNumber;
  }

  public String getModel()
  {
    return model;
  }

  public void setModel(String model)
  {
    this.model = model;
  }

  public String getHostName()
  {
    return hostName;
  }

  public void setHostName(String hostName)
  {
    this.hostName = hostName;
  }

  public String getPluginName()
  {
    return pluginName;
  }

  public void setPluginName(String pluginName)
  {
    this.pluginName = pluginName;
  }

  public String getTimeStamp()
  {
    return timeStamp;
  }

  public void setTimeStamp(String timeStamp)
  {
    this.timeStamp = timeStamp;
  }

  public List<Component> getComponentList()
  {
    return componentList;
  }

  public void setComponentList(List<Component> componentList)
  {
    this.componentList = componentList;
  }

  public void addComponent(Component component)
  {
    if (componentList == null)
    {
      componentList = new ArrayList<Component>();
    }
    componentList.add(component);
  }
}