SpringBoot定时任务(附本地运行正常部署服务器定时任务多次执行解决方案)

SpringBoot定时任务

①注解方式

import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
@EnableScheduling
public class CronTask01 {

  @Scheduled(cron = "0/5 * * * * ?")
  public void cron(){
    String date = DateUtil.format(new Date(),"HH:mm:ss");
    System.out.println(date+"注解方式执行定时任务.....");

  }
}

②接口实现方式

import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.Date;

@Component
@EnableScheduling
public class CronTask02 implements SchedulingConfigurer {

  //引入springboot为定时任务自带的线程池对象
  @Autowired
  ThreadPoolTaskScheduler pool;
    
  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {   
     String cron = "0/5 * * * * ?";
      
    //设置线程池数量为1
    pool.setPoolSize(1);
    //设置定时任务线程池
    taskRegistrar.setTaskScheduler(pool);
      
      
    taskRegistrar.addCronTask(() -> {
      String s = DateUtil.format(new Date(), "HH:mm:ss");
      System.out.println(s + "接口方式执行定时任务..........");
    }, cron);
      
//    taskRegistrar.addTriggerTask(() -> {
//      String s = DateUtil.format(new Date(), "HH:mm:ss");
//      System.out.println(s+"接口方式执行定时任务..........");
//    }, triggerContext -> {
//      CronTrigger trigger = new CronTrigger(cron);
//      Date date = trigger.nextExecutionTime(triggerContext);
//      return date;
//    });
      
  }
}

PS:开发时无论用哪种方式在本地都可以运行正常,但是一旦发布到服务器Tomcat下,定时任务会在设定时间执行两遍。一开始打印日志发现有多个线程在运行,但是把线程池数量设为1之后还会执行两遍,最后发现是Tomcat服务配置文件映射问题,配置文件为“**/tomcat/conf/server.xml”。为了启动后可以访问服务器上的图片,在外部建了一个文件夹存放图片,并在server.xml文件中添加如下配置(context节点):

<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt" />
  <!-- <Context crossContext="true" docBase="/www/wwwroot/images" path="" reloadable="true" /> -->
</Host>   

docBase表示图片存放位置,猜测因为映射关系导致服务运行两次,故把context节点删除之后定时任务正常执行一遍!

如果还想访问服务器图片只需在“**/tomcat/webapps”目录即war包所在目录下新建文件夹存放图片即可。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值