springboot根据启动文件关闭定时任务的解决方法
作者:追逐梦想永不停
一、前言
项目里有3个配置文件:
//生产环境用 application-prod.yml //测试环境用 application-test.yml //本地启动用 //为什么本地不用test?因为测试环境是linux系统,本地是windows系统,路径不一致,本地有盘符,还是得区分开 application-dev.yml
现在想让本地dev启动时,不执行定时任务,防止定时任务误启动导致影响测试环境。
代码也不想改动太多。
二、解决方法
找到了一种最小的改动方法。
1.如果是springboot项目启动类里加了@EnableScheduling
注解,那就先把这个注解拆出来,不要加,如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
2.单独建一个定时任务配置java类,如下:
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @Profile("!dev") // 非 dev 环境启用定时任务 @EnableScheduling public class SchedulingConfig { //这个配置类为空类即可,不需要内容 }
其中,@Configuration
是标志这个类是配置类,加了springboot启动时,才会扫描到这个类;
@EnableScheduling
注解标志启用定时任务功能,有了这个,其他类配置的定时任务@Scheduled(cron = "0 0/30 * * * ?")
这种才会生效;
@Profile("!dev")
表示,只有启动配置文件不是dev,才会加载这个类,如果是dev就不加载。
只有加载了这个类,才有@EnableScheduling
注解,才会开启定时任务执行;
如果不加载这个类,那就相当于没有@EnableScheduling
注解,其他类配置的定时任务@Scheduled(cron = "0 0/30 * * * ?")
不会生效,也就不会执行。
3.当application.yml
里用这个启动时:
spring: profiles: active: dev
或者启动java项目用参数-Dspring.profiles.active=dev
时(这个优先级高,会覆盖application.yml
的配置):
就说明启动参数是dev,后续读取application-dev.yml
文件;
因为启动参数是dev,所以根据@Profile("!dev")
,不加载java文件,没有开启定时任务注解,也就不会执行定时任务了。
4.可以测试,如果开启了定时任务,控制台就会有这个日志,搜索Scheduler
(没有开启就没有):
11:38:38.520 [main] INFO o.s.s.c.ThreadPoolTaskScheduler - [initialize,181] - Initializing ExecutorService 'taskScheduler'
到此这篇关于springboot根据启动文件关闭定时任务的文章就介绍到这了,更多相关springboot启动文件关闭定时任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!