我使用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;
}
哪里有问题?在我的规则?规则引擎有任何限制吗?
答案 0 :(得分:0)
如果我从相同的知识库创建Stateless KnowledgeSession,我也面临同样的问题规则会在一定数量的运行后被跳过。