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的Swing编程中使用SwingWorker线程模式及顶层容器
这篇文章主要介绍了在Java的Swing编程中使用SwingWorker线程模式及顶层容器的方法,适用于客户端图形化界面软件的开发,需要的朋友可以参考下2016-01-01
java文件操作代码片断实例实现统计文件中字母出现的个数功能
本文介绍java读文件实例,实现统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数,除此之外没有其他字符,大家参考使用吧2014-01-01
idea中解决maven包冲突的问题(maven helper)
这篇文章主要介绍了idea中解决maven包冲突的问题(maven helper),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-12-12
关于PreparedStatement的setObject作用及说明
这篇文章主要介绍了关于PreparedStatement的setObject作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03
Springboot 过滤器、拦截器、全局异常处理的方案处理小结
拦截器是一种动态拦截方法调用的机制,与过滤器类似,是Spring框架中提供的,用来动态拦截控制器方法的执行,这篇文章主要介绍了Springboot 过滤器、拦截器、全局异常处理,需要的朋友可以参考下2024-03-03


最新评论