Spring中自带的@Schedule实现自动任务的过程解析
SpringBoot中自带了一个能够实现定时任务的注解@Schedule
如果定时任务比较简单,则可以使用SpringBoot中自带的@Schedule,但是如果任务调度很复杂的话,就建议使用Quartz组件了。
说一下这个@Schedule注解怎么用?
基本使用
1.第一步:在一个方法上使用@Schedule,标注这个方法是一个自定义任务
通过该注解的cron属性,指定任务的运行规则
@Slf4j
@Component
public class MyTimeJob {
@Scheduled(cron = "0/1 * * * * *")
public void distanceOffDuty() {
log.info("现在是{},{}",new Date(),"~~~马上就要下班了");
}
}关于Cron表达式,可以自己学习,
写cron表达式是一件麻烦的事情,就像写正则表达式似的
建议使用工具来生成cron表达式
在线Cron表达式生成器
2.在配置类上通过@EnableScheduling开启定时任务配置,开启了此配置后,SpringBoot会自动扫描容器中带有@Schedule注解
注意:将包含@Schedule标注的方法所在的类,设置为Component或Configuration,要让SpringBoot知道这个类
@SpringBootApplication
@EnableScheduling
public class TestQuartzApplication {
public static void main(String[] args) {
SpringApplication.run(TestQuartzApplication.class, args);
}
}接下来启动程序,就可以看到自定义任务执行了

多线程执行
默认情况下,我们所有自定义的任务是单线程的,多个任务之间排队执行。
例如,我们定义了两个任务:
@Slf4j
@Component
public class MyTimeJob {
@Scheduled(cron = "0/1 * * * * *")
public void distanceOffDuty() {
log.info("现在是{},{}",new Date(),"~~~马上就要下班了");
}
@Scheduled(cron = "0/10 * * * * *")
public void work(){
log.info("又工作(摸鱼)了10秒钟了");
}
}看控制台这两个任务的执行情况:

如果想要为每一个任务单独开一个线程,异步化操作,效率能提高,不会被阻塞。
此时需要自定义线程池,看操作!
自定义配置类
@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {
/**
* 任务执行线程池大小
*/
private static final int TASK_POOL_SIZE = 50;
/**
* 自定义线程前缀
*/
private static final String TASK_THREAD_PREFIX = "scheduling-task-";
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
// 创建任务线程池
ThreadPoolTaskScheduler taskPool = new ThreadPoolTaskScheduler();
// 设置线程池大小
taskPool.setPoolSize(TASK_POOL_SIZE);
// 线程前缀名
taskPool.setThreadNamePrefix(TASK_THREAD_PREFIX);
// 初始化
taskPool.initialize();
scheduledTaskRegistrar.setTaskScheduler(taskPool);
}
}看自定义任务的执行情况:

每次执行任务,都会在线程池中取一个线程来使用
到此这篇关于关于Spring中自带的@Schedule实现自动任务的文章就介绍到这了,更多相关Spring @Schedule自动任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java 中Comparable与Comparator详解与比较
这篇文章主要介绍了java 中Comparable与Comparator详解与比较的相关资料,需要的朋友可以参考下2017-04-04
SpringBoot与Spring中数据缓存Cache超详细讲解
我们知道内存读取速度远大于硬盘读取速度,当需要重复获取相同数据时,一次一次的请求数据库或者远程服务,导致在数据库查询或者远程方法调用上小号大量的时间,最终导致程序性能降低,这就是数据缓存要解决的问题,学过计算机组成原理或者操作系统的同学们应该比较熟悉2022-10-10


最新评论