一定数量的命中后规则无法激活

时间:2015-01-08 01:56:02

标签: drools

我使用org.drools.runtime.rule.StatelessRuleSession.execute(Object object)方法匹配我的CollectorPluginData对象。它在地图集合中具有类型和一些其他属性。我将KnowledgeAgent作为spring bean,每次我都会从这个代理创建一个StatelessKnowledgeSession。 如果我用我的磁盘数据提供会话,它工作正常。我发现,如果我在一个循环中提供相同的数据超过20次,那么最火的20可以成功地被击中,但在那之后,如果我继续用相同的磁盘数据来提供视频,则该规则没有被激活。我似乎在规则引擎中遇到了一些限制。

示例数据在这里:

{
  "hostName": "host291",
  "timeStamp": "2014-12-30T22:59:55",
  "pluginName": "DiskCollectorPlugin",
  "jsonType": "Monitor",
  "componentList":
  [
    {
      "type":"Disk",
      "id":"252_1",
      "name":"Enclosure 252 Disk 1",
      "properties":
      {
        "isGlobalHotSpare":0,
        "isSupported":1,
        "pdDeviceType":"SAS",
        "scsiDeviceType":"Disk",
        "mediaErrorCount":0,
        "linkSpeed":3,
        "maxSupportedSpeed":"6G",
        "otherErrorCount":0,
        "predFailCount":0,
        "isForcedPdGuid":0,
        "coercedSize":1951170560,
        "lastFailedPredEventSeqNum":0,
        "shieldCounter":0,
        "isForeign":0,
        "currentComponentState":"Unconfigured Good",
        "isPdInVd":0,
        "driveReadyForRemoval":0,
        "isDedicatedHotSpare":0,
        "rawSize":1953525168,
        "slotNumber":1,
        "nonCoercedSize":1952476592,
        "enclosureId":252,
        "pdMediaType":"Rotating Media, HDD",
        "pdPowerState":"Spun Down",
        "temperatureInCelsius":255,
        "shieldDiagCompletionTime":"0000-00-00T00:00:00"
      }
    }
  ]
}

我对这些数据进行数学处理的规则是:

rule "Disk Rule"
when
    $diskData : CollectorPluginData(pluginName == "DiskCollectorPlugin", 
                                    $componentList : componentList)
    $component: Component(type == "Disk",
                          properties["scsiDeviceType"] == "Disk")
                from $componentList  
then
    System.out.println("Rule get activated.");
end

我还尝试删除Component“properties [”scsiDeviceType“] ==”Disk“”的第二个条件,并且限制消失了。无论我将相同的数据提供给会话多少次,规则总是可以被激活。

我用来运行此规则的方法:

public void processCollectorPluginData(CollectorPluginData cpd)
{
    analysisReport = new AnalysisReport();
    collectorPluginData = cpd;
    analyzerPluginData = null;
    logCollectorFiles = Collections.<String> emptyList();
    logCollectorCommands = Collections.<String> emptyList();
    StatelessKnowledgeSession ksession =    knowledgeAgent.getKnowledgeBase().newStatelessKnowledgeSession();
    KnowledgeBase knowledgeBase = knowledgeAgent.getKnowledgeBase();
    int retryCount = 0;
    while (knowledgeBase.getKnowledgePackages().size() == 0 && retryCount < 10)
    {
      System.out.println("ERROR: Issue with rules policy update, move back to previos poilcies");
      ksession = knowledgeAgent.getKnowledgeBase().newStatelessKnowledgeSession();
      knowledgeBase = knowledgeAgent.getKnowledgeBase();
      retryCount++;
    }
    if (knowledgeBase.getKnowledgePackages().size() == 0 && retryCount == 10)
    {
      throw new RuntimeException("ERROR: Rule knowledge base is null, drl files compilation issue");
    }
    ksession.addEventListener(new DroolsEventListener());
    ksession.setGlobal("ruleEngineService", this);
    ksession.execute(cpd);
    analysisReport.setAnalyzerPluginData(analyzerPluginData);
    analysisReport.setCollectorPluginData(collectorPluginData);
    try
    {
      postAnalysisReport();
      postCollectLogJob(analysisReport, logCollectorFiles, logCollectorCommands);
      LOGGER.info("Analysis Report: " + mapper.writeValueAsString(analysisReport));
    }
    catch (JsonProcessingException | RestClientException e)
    {
      LOGGER.error("Received exception:", e);
    }
    return;
}

哪里有问题?在我的规则?规则引擎有任何限制吗?

1 个答案:

答案 0 :(得分:0)

如果我从相同的知识库创建Stateless KnowledgeSession,我也面临同样的问题规则会在一定数量的运行后被跳过。