Drools规则模板 - 第一次调用比子序列调用慢{1000}

时间:2016-07-07 14:17:10

标签: java tomcat drools rule-engine

我使用Drools 6.4.0.Final

构建了Drools Rules Template

它与提供here的示例完全相同。

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

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

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

直接从单元测试中调用时,我看到了相同的行为。第一次测试很慢,后续测试速度提高了1000倍。

例如,我看到第一个电话需要30秒,而每个后续电话需要20毫秒,电子表格大约有1000行。

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

1 个答案:

答案 0 :(得分:2)

在您已关联的示例中,有一条线比其看起来要做的更多。我正在谈论的是:

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

KieContainer.newKieSession()中的一个步骤是指定KieSession所属的create the KieBaseKieBase是规则的二进制表示。构建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.**

来执行此操作

希望它有所帮助,