我使用Drools 6.4.0.Final
构建了Drools Rules Template它与提供here的示例完全相同。
我已将其封装在Spring
RestController
中,并将其作为WAR部署到Tomcat
。
我注意到,第一次调用获取结果的速度总是很慢,随着xls
电子表格中行数的增加而变慢。
我想drools会在创建第一个KieSession
时构建索引。而且这个索引随后被缓存,使得进一步调用更快?
直接从单元测试中调用时,我看到了相同的行为。第一次测试很慢,后续测试速度提高了1000倍。
例如,我看到第一个电话需要30秒,而每个后续电话需要20毫秒,电子表格大约有1000行。
有没有办法在Web应用程序服务器(Tomcat
)启动时强制执行此“索引”步骤?
答案 0 :(得分:2)
在您已关联的示例中,有一条线比其看起来要做的更多。我正在谈论的是:
KieSession ksession = kc.newKieSession( "DTableWithTemplateKS" );
KieContainer.newKieSession()
中的一个步骤是指定KieSession
所属的create the KieBase
。 KieBase
是规则的二进制表示。构建KieBase
后,它可用于生成多个KieSessions
(其运行时对应项)。创建KieBase
可能非常耗时。从它产生新的KieSessions
它不是。
KieContainer
班级使用internal Map来保留对已构建的KieBases
的引用。当您第一次向KieContainer
询问KieSession
KieContainer
时,KieBase
首先构建newKieSession()
。调用KieSession
后,将重用已构建的KieBase。请注意,只要您总是要求相同的KieBases
,这都是正确的。尝试使用多个KieSessions
并向他们请求不同的KieSession
,您会看到第一次从新KieBase
请求KieContainer
时,您会遇到此延迟。
您可以做的一件事就是在您的应用启动时向KieBase
询问kc.newKieSession( "XXX" );
。您可以通过执行kc.getKieBase("YYY");
或-dontwarn com.google.api.**
希望它有所帮助,