Springboot学习笔记(二)-定时任务
springboot中要使用定时任务需要在配置类或启动类上标注注解@EnableScheduling,并在定时执行的无参方法上标注注解@Scheduled,程序启动后会根据@Scheduled所提供的信息定时执行。
Scheduled参数
| 参数名 | 含义 |
|---|---|
| cron = "* * * * * ?" | 每秒执行 |
| zone | 时区,默认为本地时区TimeZone.getDefault() |
| fixedDelay = 1000 | 上次任务执行完成后1秒开始 |
| fixedDelayString = "1000" | 等同fixedDelay = 1000 |
| fixedRate = 1000 | 每秒执行 |
| fixedRateString = "1000" | 等同fixedRate = 1000 |
| initialDelay = 1000 | 初始延时1秒执行 |
| initialDelayString = "1000" | 等同initialDelay = 1000 |
cron表达式
不用记,网上有在线cron生成器
**String
公司规定的代码规范中不允许使用魔法数字,可以用这些参数规避。
代码
@Component
public class ScheduledHelloTask {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledHelloTask.class);
private int getSecond() {
return Calendar.getInstance().get(Calendar.SECOND);
}
// 每秒执行
@Scheduled(cron = "* * * * * ?", zone = "Asia/Shanghai")
public void sayHello() {
LOGGER.info("Hello World!");
}
// 任务执行完成后延时1秒开始
@Scheduled(fixedDelay = 1000)
public void sayHello1() throws InterruptedException {
LOGGER.info(getSecond() + "春暖花开~");
Thread.sleep(1000);
}
// 每秒执行,效果等同{cron = "* * * * * ?"}
@Scheduled(initialDelay = 2000, fixedRate = 1000)
public void sayHello2() throws InterruptedException {
LOGGER.info(getSecond() + "你好~");
}
}
关闭
有时候我们在得到自己需要的结果后想关闭定时任务,比如通过前台发送链接来开启上面的打印Hello World!任务,希望它执行10次后关闭。
此时就不能在类ScheduledHelloTask上添加@Component了, 因为我们需要动态注册bean来实现。改造如下:
@EnableScheduling
public class ScheduledHelloTask {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledHelloTask.class);
private AtomicInteger atomicInteger = new AtomicInteger();
public AtomicInteger getAtomicInteger() {
return atomicInteger;
}
public void setAtomicInteger(AtomicInteger atomicInteger) {
this.atomicInteger = atomicInteger;
}
// 每秒执行
@Scheduled(cron = "* * * * * ?", zone = "Asia/Shanghai")
public void sayHello() {
int count = atomicInteger.incrementAndGet();
LOGGER.info("第" + count + "次:Hello World!");
}
}
添加ScheduleController,代码如下:
@RestController
public class ScheduleController {
private static final String BEAN_NAME = "scheduledHelloTask";
@GetMapping
public String sayHi() throws InterruptedException {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext();
if (!applicationContext.containsBean(BEAN_NAME)) {
applicationContext.register(ScheduledHelloTask.class);
}
applicationContext.refresh();
while (applicationContext.containsBean(BEAN_NAME)) {
if (applicationContext.getBean(ScheduledHelloTask.class).getAtomicInteger().get() == 10) {
applicationContext.removeBeanDefinition(BEAN_NAME);
}
}
return "success";
}
}
两次访问localhost:8080,结果如下:

预期效果已实现!
Springboot学习笔记(二)-定时任务的更多相关文章
- SpringBoot学习笔记<二>注解
此篇为项目作结之笔记,关于注解. 项目启动入口@SpringBootApplication[必选] @ServletComponentScan[可选] 注解后: Servlet.Filter.Lis ...
- SpringBoot学习笔记二之Spring整合Mybatis
原文链接: https://www.toutiao.com/i6803235766274097678/ 在learn-admin-component子工程中加入搭建环境所需要的具体依赖(因为比较长配置 ...
- springboot 学习笔记(二)
springboot 学习笔记(二) 快速创建一个springboot工程,并引入所需要的依赖 1.利用Spring initializr 来创建一个springboot项目,登陆http://sta ...
- Springboot学习笔记(六)-配置化注入
前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...
- SpringBoot学习笔记(3):静态资源处理
SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...
- SpringBoot学习笔记(12):计划任务
SpringBoot学习笔记(12):计划任务 计划任务 在企业的实践生产中,可能需要使用一些定时任务,如月末.季末和年末需要统计各种各样的报表,每周自动备份数据等. 在Spring中使用定时任务 1 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
随机推荐
- crm的知识点整理
''' # 1. 通过ChangeList封装好多数据 # 2. 销售中公共资源:Q查询,3天 15天 from django.db.models import F,Q F 使用查询条件的值,专门取对 ...
- Problem D: 指针函数
Description YHZ自认为很聪明的人, 在C语言课上老师布置了一个作业,让能求正方形和圆的面积, 正当YHZ要跃跃欲试的时候, 老师却要求使用函数指针来实现这个功能,YHZ立马就不会了,他现 ...
- eclipse中出现的一些错误
selection dose not contain a main type解决办法:main忘记加static
- python 爬虫不停换代理
内网看到的一个小技巧,卧槽,感觉真TM厉害 函数均放到main函数内即可 def get_proxy(): url="http://www.xicidaili.com" req=u ...
- 细说ASP.NET Windows身份认证
上篇博客我谈到了一些关于ASP.NET Forms身份认证方面的话题,这次的博客将主要介绍ASP.NET Windows身份认证. Forms身份认证虽然使用广泛,不过,如果是在 Windows Ac ...
- iphone程序适配ipad可以用下面的宏进行尺寸改写
//判断是否为iPad #define ISIPAD [[[UIDevice currentDevice].model substringToIndex:4] isEqualToString:@&qu ...
- python测试开发django-47.xadmin上传图片和文件
前言 xadmin上传图片和上传文件功能 依赖环境 如果没安装Pillow的话,会有报错:practise.Upload.upload_image: (fields.E210) Cannot use ...
- ln: creating symbolic link XXXXXX : Operation not supported
ln: creating symbolic link XXXXXX : Operation not supported 转自:https://blog.csdn.net/z444_579/articl ...
- Always run a program in administrator mode in Windows 10
From: https://www.cnet.com/how-to/always-run-a-program-in-administrator-mode-in-windows-10/ If you'r ...
- SQL Server2012 配置管理器无法打开
由于需要电脑上装了 SQLServer 2008 R2 和 SQLServer 2012 两个版本的数据库,两个库的实例名称不一样,之前一直用实例名连接对应的数据库,正常没有问题.现在用 “ip+端口 ...