Drools 规则模板 - 第一次调用比后续调用慢 1000 倍

Drools Rules Template - first invocation 1000 times slower than subsequence invocations

我使用 Drools 6.4 构建了一个 Drools Rules Template。0.Final

它与提供的示例几乎相同 here

我已将其包装在 Spring RestController 中并将其作为 WAR 部署到 Tomcat.

我注意到第一次调用获取结果的速度总是很慢,并且随着 xls 电子表格中行数的增加而变慢。

我想 drools 在创建第一个 KieSession 时会构建一个索引。并且该索引随后被缓存,使进一步的调用更快?

我在直接从单元测试调用时看到了相同的行为。第一次测试很慢,随后的测试快了 1000 倍。

例如,我看到第一次调用需要 30 秒,每次后续调用需要 20 毫秒,其中电子表格大约有 1000 行。

有没有办法在 Web 应用程序服务器 (Tomcat) 启动时强制执行此 "indexing" 步骤?

在您链接的示例中,有一条线的作用比看起来要大。我说的那行是:

KieSession ksession = kc.newKieSession( "DTableWithTemplateKS" );

KieContainer.newKieSession() 中的一个步骤是 create the KieBase 指定的 KieSession 所属。 KieBase 是您的规则的二进制表示。一旦构建了 KieBase,它就可以用于生成多个 KieSessions(它们的运行时对应物)。创建 KieBase 可能非常耗时。从中产生新的 KieSessions 它不是。

KieContainer class 使用 internal Map 来保持对已构建的 KieBases 的引用。第一次向 KieContainer 请求 KieSession 时,KieContainer 必须先构建 KieBase。在调用 newKieSession() 之后将重用已经构建的 KieBase。请注意,只要您始终要求相同的 KieSession,这就是事实。尝试使用多个 KieBases 并向他们请求不同的 KieSessions,您会发现第一次从新的 KieBase 请求 KieSession 时,您会遇到这种延迟。

您可以做的一件事是在您的应用程序启动时向 KieContainer 询问您的 KieBase。您可以通过执行 kc.newKieSession( "XXX" );kc.getKieBase("YYY");

来做到这一点

希望对您有所帮助,