Drools 规则在一定命中次数后无法激活
我使用org.drools.runtime.rule.StatelessRuleSession.executeObject对象方法来匹配我的CollectorPluginData对象。它在地图集合中具有类型和一些其他属性。我将KnowledgeAgent保留为Springbean,每次我都将从此代理创建一个无状态KnowledgeSession。 如果我向会话提供磁盘数据,它就可以正常工作。我发现,如果我在一个循环中输入相同的数据超过20次,firest 20可能会成功命中,但在那之后,如果我继续输入相同的磁盘数据,则不会激活规则。似乎我在规则引擎中受到了一些限制 示例数据如下:Drools 规则在一定命中次数后无法激活,drools,Drools,我使用org.drools.runtime.rule.StatelessRuleSession.executeObject对象方法来匹配我的CollectorPluginData对象。它在地图集合中具有类型和一些其他属性。我将KnowledgeAgent保留为Springbean,每次我都将从此代理创建一个无状态KnowledgeSession。 如果我向会话提供磁盘数据,它就可以正常工作。我发现,如果我在一个循环中输入相同的数据超过20次,firest 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
我还尝试删除组件属性[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;
}
问题在哪里?按我的规则?规则引擎是否有任何限制?我也面临同样的问题如果我从同一知识库创建无状态KnowledgeSession,则在运行一定次数后,规则将被跳过 数据示例包含许多不相关的字段和属性,但缺少scsiDeviceType:Disk,因此根本不应触发规则。-我可以猜测组件和CollectorPluginData的Java类型,但我猜不到激活会话的代码、如何提供数据、是否有其他可能匹配的数据等等。这看起来像是一个约束抖动问题。。我同意劳恩的观点,你的样本数据有没有触发过这个规则?不管怎样,您使用的是哪个版本?对不起,我附加了不正确的数据。更新样本数据。我使用5.6.0.Final.@DavideSottara另一个MVEL vs抖动气味?尽管这是一个直接访问:properties[scsiDeviceType]-no-contains。当规则在一定次数的运行后停止触发时,jitting总是第一个可疑的:,尤其是当涉及到旧版本(如5.5/5.6)时。我正在旅行,所以在下周之前我无法测试更新的复制机请描述您使用的版本并提供复制机。否则几乎不可能有帮助。