Springboot schedule 执行定时任务

本文详细介绍了在SpringBoot中集成定时任务的简便方法,无需@EnableScheduling注解即可实现。通过@Scheduled注解定义定时任务,支持串行与并行执行,演示了如何通过实现SchedulingConfigurer并配置线程池来支持并行任务执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时任务在springboot中的集成非常简单。

在一些博客中说到需要在启动类中加入@EnableScheduling注解来开启定时任务,其实这是不需要的。

@EnableScheduling 注解的作用是发现注解@Scheduled的任务并后台执行,但是我没有加上这个也能发现定时任务。

我们直接创建实现定时任务的service即可:

@Component
public class ScheduledTest {
	private static final Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
	
	@Scheduled(cron="0 0/1 * * * ?")
	public void task1() {
	    // 间隔1分钟,执行任务
	    Thread current = Thread.currentThread();
	    logger.info("ScheduledTest.task1 :"+current.getId()+ ",name: "+current.getName());
	}
	
	@Scheduled(cron="0 0/1 * * * ?")
	public void task2() {
	    // 间隔1分钟,执行任务
	    Thread current = Thread.currentThread();
	    logger.info("ScheduledTest.task2 :"+current.getId()+ ",name: "+current.getName());
	}
}

@Scheduled 注解用于标注这个方法是一个定时任务的方法,有多种配置可选。

Springboot本身默认的执行方式是串行执行,也就是说无论有多少task,都是一个线程串行执行,并行需手动配置。

并行任务只需要实现SchedulingConfigurer类并重写其方法即可:

@Component
public class ScheduledTest implements SchedulingConfigurer {
	private static final Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
	
	@Scheduled(cron="0 0/1 * * * ?")
	public void task1() {
	    // 间隔1分钟,执行任务
	    Thread current = Thread.currentThread();
	    logger.info("ScheduledTest.task1 :"+current.getId()+ ",name: "+current.getName());
	}
	
	@Scheduled(cron="0 0/1 * * * ?")
	public void task2() {
	    // 间隔1分钟,执行任务
	    Thread current = Thread.currentThread();
	    logger.info("ScheduledTest.task2 :"+current.getId()+ ",name: "+current.getName());
	}

	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		// 创建一个定长线程池,支持定时及周期性任务执行。
		ScheduledExecutorService pool = Executors.newScheduledThreadPool(100);
		taskRegistrar.setScheduler(pool);
	}
}

此时再次启动程序,会发现任务使用的线程不是同一个。可以使用sleep()方法来看出效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值