我构建了一个 Drools Rules Template使用 Drools 6.4.0.Final
它与提供的示例几乎相同 here .
我将它包装在 Spring
RestController
中并将其作为 WAR 部署到 Tomcat
中。
我注意到第一次调用获取结果的速度总是很慢,并且随着 xls
电子表格中行数的增加而变慢。
我想 drools 在创建第一个 KieSession
时会构建一个索引。并且该索引随后被缓存,从而使进一步的调用更快?
我在直接从单元测试调用时看到了相同的行为。第一次测试很慢,后续测试快 1000 倍。
例如,我看到第一次调用需要 30 秒,每次后续调用需要 20 毫秒,其中电子表格大约有 1000 行。
有没有办法在 Web 应用程序服务器 (Tomcat
) 启动时强制执行此“索引”步骤?
最佳答案
在您链接的示例中,有一条线的作用比看起来要大。我要说的是:
KieSession ksession = kc.newKieSession( "DTableWithTemplateKS" );
KieContainer.newKieSession()
中的一个步骤是 create the KieBase
指定的 KieSession
属于。 KieBase
是您的规则的二进制表示。一旦构建了 KieBase
,它就可以用于生成多个 KieSessions
(它们的运行时对应物)。创建 KieBase
可能非常耗时。不是从它生成新的 KieSessions
。
KieContainer
类使用 internal Map保留对已构建的 KieBases
的引用。第一次向 KieContainer
请求 KieSession
时,KieContainer
首先构建 KieBase
。在调用 newKieSession()
之后将重用已经构建的 KieBase。请注意,只要您始终请求相同的 KieSession
,情况就是如此。尝试使用多个 KieBases
并向它们请求不同的 KieSessions
,您会发现第一次从新的 请求
你会遇到这种延迟。KieSession
>KieBase
您可以做的一件事是在您的应用程序启动时向 KieContainer
询问您的 KieBase
。您可以通过执行 kc.newKieSession( "XXX");
或 kc.getKieBase("YYY");
希望对你有帮助
关于java - Drools 规则模板 - 第一次调用比后续调用慢 1000 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38247847/