我已经使用Drools 6.4.0.Final构建了Drools规则模板。
它与此处提供的示例几乎相同。
我将其包装在中,Spring RestController并作为WAR部署到中Tomcat。
Spring
RestController
Tomcat
我注意到第一次调用总是很慢才能得到结果,并且随着xls电子表格中行数的增加而变得越来越慢。
xls
我想象当第一个KieSession创建时,流口水会建立一个索引。并且该索引随后被缓存,从而使进一步的调用更快吗?
KieSession
直接从单元测试调用时,我看到相同的行为。第一次测试很慢,随后的测试快了1000倍。
例如,我看到第一个调用花费30秒,而随后的每个调用花费20毫秒,其中电子表格有约1000行。
当Web应用程序服务器(Tomcat)启动时,是否有办法强制执行此“索引编制”步骤?
在您链接的示例中,有一行正在做的事情比看起来正在做的要多。我要说的是:
KieSession ksession = kc.newKieSession( "DTableWithTemplateKS" );
里面的步骤之一KieContainer.newKieSession()是创建KieBase指定的KieSession所属。A KieBase是规则的二进制表示形式。一旦KieBase建成,它可以被用来生成多个KieSessions(与其对应运行时)。创建a KieBase可能非常耗时。KieSessions从它产生新的不是。
KieContainer.newKieSession()
KieBase
KieSessions
本KieContainer类使用内部地图,以保持该基准KieBases已经建立了。第一次你问KieContainer一个KieSession的KieContainer具有率先建成的KieBase。调用newKieSession()后将重用已经构建的KieBase。请注意,只要您始终要求相同,便是正确的KieSession。尝试拥有多个KieBases并要求与之不同KieSessions,您会发现,第一次KieSession从新要求中会有一个KieBase延迟。
KieContainer
KieBases
newKieSession()
您可以做的一件事是在启动应用程序时询问KieContainer您KieBase。您可以通过执行kc.newKieSession( "XXX");或kc.getKieBase("YYY");
kc.newKieSession( "XXX");
kc.getKieBase("YYY");
希望能帮助到你,