使用@Scheduled注解 定时任务会重复执行多次的问题

使用@Scheduled注解 定时任务会重复执行多次的问题

  1. 分析定时任务类是否多次实例化
    可能类上已经加了@compent注解,xml配置文件里又 compen-scan 扫描了一遍
  2. 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"/>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值