使用@Scheduled注解 定时任务会重复执行多次的问题
- 分析定时任务类是否多次实例化
可能类上已经加了@compent注解,xml配置文件里又 compen-scan 扫描了一遍 - tomcat里 server.xml 配置问题
例如有以下配置
<Host name="..........." appBase="webapps"
unpackWARs="true" autoDeploy="false"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" docBase="XXX" reloadable="true" crossContext="true"></Context>
</Host>
前提条件:XXX项目已经在webapps目录下面
首先介绍下 appBase 与 docBase 的区别 appBase 是指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于 Tomcat 目录的相对目录,如果没有此项,默认为 webapps docBase 是指定 Web 应用的文件路径,可以给定绝对路径,也可以给定相对于 Host 的 appBase 属性的相对路径;如果 Web 应用采用开放目录结构,那就指定 Web 应用的根目录;如果 Web 应用是个 WAR 文件,那就指定 WAR 文件的路径
问题分析:
根据上面例子里的server.xml配置,Tomcat首先根据<Context>docBase的配置内容生成第一个StandardContext对象,加载一次XXX项目。然后再根据<Host>appBase的配置对webapps下面的所有项目生成第二个StandardContext,再加载一次XXX项目。Tomcat针对同一项目生成两个StandardContext的原因就是因为他们的名字不同,Tomcat认为是两个Context,所以加载了两次。
解决方法:
①直接把项目直接扔到webapps下,不要指定<Context>配置内容。
这样的话就没办法直接ip加端口去访问项目了
②不要把项目放入webapps目录下,在webapps同级下新建文件夹mywebapp,设置appBase=“webapps”,然后配置<Context>标签
<Context docBase="../mywebapp/XXX" path="/" reloadable="true"/>
③道理同②,不要把项目放入webapps目录下,放在一个自定义路径下,然后配置<Context>标签
<Context docBase="自定义的绝对路径/XXX" path="/" reloadable="true"/>