前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 中,@Scheduled 注解的使用方法

Spring 中,@Scheduled 注解的使用方法

作者头像
水货程序员
修改2018-12-03 14:59:48
5.3K0
修改2018-12-03 14:59:48
举报
文章被收录于专栏:javathings

Spring 中,@Scheduled 注解的使用方法

Spring 提供了@Scheduled 注解,良好的解决了定时任务的需求,它的实现本质是基于 java 中的 ScheduledExecutorService 类的 schedule 方法。

@Scheduled 注解标注在方法上,它是 Spring 实现的一种计划任务,可以支持如下几种方式运行:

固定时间频率运行方法。

延迟指定的时间运行方法。

按照 cron 表达式定义的时间方式运行方法。(cron 表达式的基本概念,自行查找相关材料。)

代码语言:javascript
复制
@Scheduled(fixedDelay =30000)
public void doJob() {
}
 
@Scheduled(fixedRate=30000)
public void doJob() {
}
 
@Scheduled(cron="0 0 * * * *")
public void doJob() {
}

使用@Scheduled 注解的时,按如下步骤:

1. 配置文件中,打开运行执行 Schedule 任务的开关,使用注解

@EnableScheduling。

2. 将某个类的方法标注@Scheduled。

3. 启动 Spring 容器应用。

使用注解@EnableScheduling。

代码语言:javascript
复制
@Configuration
@ComponentScan(value = "com.learn")
@EnableScheduling
public class Config {
 
}

在方法上标注@Scheduled。

代码语言:javascript
复制
@Component
public class ScheduledTaskService {
	@Scheduled(fixedRate = 1000) //使用fixedRate属性每隔1秒执行
    public void doJob(){
	System.out.println("doJob..." + Thread.currentThread().getName() + "," + new Date());
    }
}

启动 Spring 容器。

代码语言:javascript
复制
public static void main(String[] args) {
		// 使用Config.class这个配置类
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config.class);
 
		//防止主进程立即运行完毕,延迟10秒退出主进程
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		applicationContext.close();
	}

结果, 每隔一秒执行一次函数。同一个线程执行:

代码语言:javascript
复制
doJob...pool-1-thread-1,Fri Sep 07 22:52:13 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:14 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:15 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:16 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:17 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:18 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:19 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:20 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:21 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:22 CST 2018
doJob...pool-1-thread-1,Fri Sep 07 22:52:23 CST 2018

默认单线程运行

@Schduled 默认是基于单线程执行, 所有的定时任务串行执行,这就可能导致运行时间久的任务,会影响到下一个运行周期的任务。参考下图了解影响点。

图片来自于网络(https://blog.csdn.net/applebomb/article/details/52400154)

如果需要基于多线程执行,则需要配置。可以在配置文件中加入如下代码:

代码语言:javascript
复制
<task:annotation-driven scheduler="scheduler"/>
<task:scheduler id="scheduler" pool-size="5"/>

如上的配置用于设置线程池,这样多个定时任务就可以并行执行。

基于注解的配置方式,就是在容器中,增加一个 ScheduledThreadPoolExecutor 类型的实例即可。

代码语言:javascript
复制
@Configuration
public class AppConfig {
    @Bean
    public ScheduledThreadPoolExecutor scheduledExecutorService() {
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5);
        return executor;
    }
}

修改一下运行任务的代码,运行 2 种任务。

代码语言:javascript
复制
@Component
public class ScheduledTaskService {
	@Scheduled(fixedRate = 1000) //使用fixedRate属性每隔1秒执行
    public void doJob1(){
        System.out.println("doJob1..."+Thread.currentThread().getName()+","+new Date());
    }
	
	@Scheduled(fixedRate = 2000) //使用fixedRate属性每隔2秒执行
    public void doJob2(){
        System.out.println("doJob2..."+Thread.currentThread().getName()+","+new Date());
    }
}

运行结果如下:

代码语言:javascript
复制
doJob1...pool-1-thread-1,Fri Sep 07 22:55:00 CST 2018
doJob2...pool-1-thread-1,Fri Sep 07 22:55:00 CST 2018
doJob1...pool-1-thread-1,Fri Sep 07 22:55:01 CST 2018
doJob1...pool-1-thread-3,Fri Sep 07 22:55:02 CST 2018
doJob2...pool-1-thread-3,Fri Sep 07 22:55:02 CST 2018
doJob1...pool-1-thread-1,Fri Sep 07 22:55:03 CST 2018
doJob2...pool-1-thread-2,Fri Sep 07 22:55:04 CST 2018
doJob1...pool-1-thread-5,Fri Sep 07 22:55:04 CST 2018
doJob1...pool-1-thread-5,Fri Sep 07 22:55:05 CST 2018
doJob2...pool-1-thread-1,Fri Sep 07 22:55:06 CST 2018
doJob1...pool-1-thread-5,Fri Sep 07 22:55:06 CST 2018
doJob1...pool-1-thread-5,Fri Sep 07 22:55:07 CST 2018
doJob1...pool-1-thread-2,Fri Sep 07 22:55:08 CST 2018
doJob2...pool-1-thread-2,Fri Sep 07 22:55:08 CST 2018
doJob1...pool-1-thread-3,Fri Sep 07 22:55:09 CST 2018
doJob1...pool-1-thread-1,Fri Sep 07 22:55:10 CST 2018
doJob2...pool-1-thread-1,Fri Sep 07 22:55:10 CST 2018
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring 中,@Scheduled 注解的使用方法
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档