项目中一直使用Strust2WEB框架,采用Convention插件来配置Struts的页面流。之前由于项目小,使用起来也没有出现什么问题。
前些天项目组的同事说应用在Tomcat中启动太慢,有没有什么优化办法?开始我也觉得很奇怪,在Tomcat这个轻量级WEB服务器上发布应用还能慢到哪里去!然而现实是残酷的,我发现在Tomcat中发布真的要几分钟时间!只能一点点来分析为什么慢了。
排除了项目自身的因素,我发现struts2Filter 初始化时花费了很长时间,跟踪发现是Convention 搜索Action配置慢造成的。说实话这种情况在生产环境中我也没有办法,但在开发环境中,由于不同的开发人员维护不同的package,我们可以在这上面做点手脚.
看Struts2 convention的代码,发现可以通过一些Struts常量的配置,来限定Convention的搜索范围,进行合适的设置,会大大缩短启动时间。
Convention预留了几个常量,他们依次是:
struts.convention.package.locator,用于指定哪些package属性进入搜索范围,默认好像是struts,strut2,action,actions
struts.convention.action.packages:用于指定哪些package中的类纳入扫描范围,如果设置为com.a,则表明com.a之下的class都纳入扫描范围,可以设置多个路径,中间使用”,”分隔。
我们可以适当配置 struts.convention.action.packages和struts.convention.package.locator,做到限定扫描范围,加速启动的目的。
需要注意的是:Struts在处理这些参数的时候,采用的是||(OR)逻辑,即
判断package范围 || 判断locator ,因此如果要使用package限定范围的话,最好将locator设置为空,避免出现影响。
一个简单的例子:
<constantname="struts.convention.package.locators" value=""/>
<constantname="struts.convention.action.packages" value="com.a,com.b,com.c.d"/>