前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 中,定时任务接口 SchedulingConfigurer

Spring 中,定时任务接口 SchedulingConfigurer

作者头像
水货程序员
修改2018-12-03 14:55:29
22.6K2
修改2018-12-03 14:55:29
举报
文章被收录于专栏:javathingsjavathings

Spring 中,定时任务接口 SchedulingConfigurer

Spring 中,创建定时任务除了使用@Scheduled 注解外,还可以使用 SchedulingConfigurer。

@Schedule 注解有一个缺点,其定时的时间不能动态的改变,而基于 SchedulingConfigurer 接口的方式可以做到。SchedulingConfigurer 接口可以实现在@Configuration 类上,同时不要忘了,还需要@EnableScheduling 注解的支持。

该接口的实现方法如下:

public void configureTasks(ScheduledTaskRegistrar taskRegistrar)

其中 ScheduledTaskRegistrar 类的方法有下列几种:

从方法的命名上可以猜到,方法包含定时任务,延时任务,基于 Cron 表达式的任务,以及 Trigger 触发的任务。

下面演示了使用方法。

代码语言:javascript
复制
@Configuration
@ComponentScan(value = "com.learn")
@EnableScheduling
public class Config implements SchedulingConfigurer {
	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.addFixedRateTask(() -> System.out.println("执行定时任务1: " + new Date()), 1000);
		TriggerTask triggrtTask = new TriggerTask( // 任务内容.拉姆达表达式
				() -> {System.out.println("执行定时任务2: " + new Date());},
				// 设置触发器,这里是一个拉姆达表达式,传入的TriggerContext类型,返回的是Date类型
				triggerContext -> {
					// 2.3 返回执行周期(Date)
					return new CronTrigger("*/2 * * * * ?").nextExecutionTime(triggerContext);
				});
 
		taskRegistrar.addTriggerTask(triggrtTask);
	}
}

默认的,SchedulingConfigurer 使用的也是单线程的方式,如果需要配置多线程,则需要指定 PoolSize,加入如下代码即可:

代码语言:javascript
复制
@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
		taskScheduler.setPoolSize(10);
		taskScheduler.initialize();
		taskRegistrar.setTaskScheduler(taskScheduler);
	}

动态修改定时规则

SchedulingConfigurer 动态修改定时规则,网上有两种方法,都有缺点。

1. 一种如下:

https://blog.csdn.net/xht555/article/details/53121962

此方法,是在触发运行的时候,刷新定时规则,这种方法的缺点是,刷新规则的时间必须是在某次触发运行的时候。

2. 另一种是

https://blog.csdn.net/jianggujin/article/details/77937316

此方法基于 SchedulingConfigurer 的源码,捕获 ScheduledTaskRegistrar 类的实例,通过该类中的 TaskScheduler 实例操作定时任务的增删,而非采用 ScheduledTaskRegistrar.addTriggerTask 方法维护定时任务。所以需要自行写代码维护定时任务列表,控制任务的删减,代码的实现比较繁琐。

如果想要实现可以动态修改的定时策略,建议使用开源组件 Quartz

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring 中,定时任务接口 SchedulingConfigurer
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档