Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Drools 如何找到需要很长时间才能完成的规则_Drools_Rule Engine - Fatal编程技术网

Drools 如何找到需要很长时间才能完成的规则

Drools 如何找到需要很长时间才能完成的规则,drools,rule-engine,Drools,Rule Engine,我们有大约15000条规则正在运行,需要2小时才能完成。我想知道哪条规则需要很长时间。对于我来说,不可能去每个规则并记录它。因此,我实现了AgendaEventListener并重写afterMatchFired()方法。我知道哪些规则被取消了。但是我如何知道哪个规则花费了很长的时间。如果您想要执行匹配的时间,请更新您的侦听器以实现beforeMatchFired方法。当触发beforeMatchFired方法时,启动计时器。当相同规则的afterMatchFired触发时,停止计时器并记录它。

我们有大约15000条规则正在运行,需要2小时才能完成。我想知道哪条规则需要很长时间。对于我来说,不可能去每个规则并记录它。因此,我实现了AgendaEventListener并重写afterMatchFired()方法。我知道哪些规则被取消了。但是我如何知道哪个规则花费了很长的时间。

如果您想要执行匹配的时间,请更新您的侦听器以实现
beforeMatchFired
方法。当触发beforeMatchFired方法时,启动计时器。当相同规则的
afterMatchFired
触发时,停止计时器并记录它。您还需要跟踪取消的比赛,以丢弃不必要的计时器


记住要根据每个规则跟踪这一点——您需要唯一地标识每个规则(包+名称应该足够具体)。请注意,如果您有扩展其他规则的规则,则此练习将变得有点复杂。

您应该查看新的
drools metric
模块,该模块正好解决了您的问题,而不是您自己的配置文件

使用drools公制模块识别规则中的障碍物 您可以使用drools度量模块来识别慢速规则 当你处理许多规则时。drools公制模块也可以提供帮助 在分析发动机性能时。请注意 drools公制模块不用于生产环境。然而, 您可以在测试环境中执行分析

要使用Drools度量分析Drools引擎性能,请添加 drools度量项目依赖项并启用跟踪日志记录 对于org.drools.metric.util.MetricLogUtils,如下所示 例如:


从中尝试
ruleschronogenedaeventlistener
RulesChronoChartRecorder

两者都提供实时JMX监控,显示每个规则的平均和最大执行时间。其次,收集jfreechart数据,及时向您展示价值观,这会让您对整体绩效和“问题”案例有完美的感觉

注册会话侦听器

AgendaEventListener rulesChrono = new RulesChronoChartRecorder().withMaxThreshold(500).schedule();
session.addEventListener(rulesChrono);
按规则打印统计信息

StringBuilder sb = new StringBuilder();
rulesChrono.getPerfStat().values()
        .forEach(s -> sb.append(format("%n%s - min: %.2f avg: %.2f max: %.2f activations: %d", s.getDomain(), s.getMinTimeMs(), s.getAvgTimeMs(), s.getMaxTimeMs(), s.getLeapsCount())));
System.out.println(sb.toString());
绘制图表

Map<String, TimeSeries> rulesMaxChart = rulesChrono.getRulesMaxChart();
Map<String, TimeSeries> rulesMinChart = rulesChrono.getRulesMinChart();
rulesChrono.getRulesAvgChart().entrySet()
        .forEach(e -> ChartUtils.pngChart(format("charts/%s.png", e.getKey()), 1024, 500, e.getValue(), Color.black, rulesMaxChart.get(e.getKey()), Color.lightGray, rulesMinChart.get(e.getKey()), Color.lightGray));
Map rulesmaxhart=rulesChrono.getrulesmaxhart();
Map rulesMinChart=rulesChrono.getRulesMinChart();
rulesChrono.getRulesAvgChart().entrySet()的
.forEach(e->ChartUtils.pngChart(格式(“charts/%s.png”,e.getKey()),1024500,e.getValue(),Color.black,rulesMaxChart.get(e.getKey()),Color.lightGray,rulesMinChart.get(e.getKey()),Color.lightGray));

对于第二个问题,您只需要在此处发表评论,因为术语“规则执行”有时用于“规则评估”和“激活执行”。@Roddy描述的方法可用于计算“激活执行”时间。如果你想知道为什么你的规则要花很长时间来评估,那么事情就会变得非常复杂(如果不是不可能的话),因为Drools并不是独立地评估每个规则的每个条件,甚至不是按顺序评估每个规则的每个条件。同意。如果涉及的java对象特别复杂,我建议尝试对它们进行仪器化。另一件可能发生的事情是,可能会有“更新”(或类似)调用导致规则作为一个整体重新评估的次数超过需要(或预期)。@EstebanAliverti我们现在跟踪约束评估的次数,看到我的答案了吗?太好了!我不知道那件事。