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学习笔记(二)-定时任务的更多相关文章

  1. SpringBoot学习笔记<二>注解

    此篇为项目作结之笔记,关于注解. 项目启动入口@SpringBootApplication[必选]  @ServletComponentScan[可选] 注解后: Servlet.Filter.Lis ...

  2. SpringBoot学习笔记二之Spring整合Mybatis

    原文链接: https://www.toutiao.com/i6803235766274097678/ 在learn-admin-component子工程中加入搭建环境所需要的具体依赖(因为比较长配置 ...

  3. springboot 学习笔记(二)

    springboot 学习笔记(二) 快速创建一个springboot工程,并引入所需要的依赖 1.利用Spring initializr 来创建一个springboot项目,登陆http://sta ...

  4. Springboot学习笔记(六)-配置化注入

    前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...

  5. SpringBoot学习笔记(3):静态资源处理

    SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...

  6. SpringBoot学习笔记(12):计划任务

    SpringBoot学习笔记(12):计划任务 计划任务 在企业的实践生产中,可能需要使用一些定时任务,如月末.季末和年末需要统计各种各样的报表,每周自动备份数据等. 在Spring中使用定时任务 1 ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  9. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  10. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

随机推荐

  1. Python3科学计算库概况

    Python3科学计算常见库入门 Numpy快速数据处理库 参见我的博客 http://www.cnblogs.com/brightyuxl/p/8981294.html http://www.cnb ...

  2. 早期(编译器)优化--javac编译器

    java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用 ...

  3. BZOJ4053 : [Cerc2013]Subway

    通过BFS可以求出到每个站点的最小花费. 每次从队首取出一个点,枚举所有它能花费1块钱就到达的线路,通过两遍递推求出最大时间. 注意到每个点和每条线路只有第一次使用时有用,所以总时间复杂度为$O(n+ ...

  4. Qt 4.6.2静态编译

    一.下载mingw 4.4.0:ftp://ftp.trolltech.com/misc/MinGW-gcc440_1.zip 二.解压到C:\mingw目录下,设置环境变量path将C:\mingw ...

  5. AngularJS中页面呈现html代码段

    如何在页面呈现一段html代码段呢? 在textarea中我们这样写: <textarea name="" id="" cols="30&quo ...

  6. AngularJS中监视Scope变量以及外部调用Scope方法

    在AngularJS中,有时候需要监视Scope中的某个变量,因为变量的改变会影响一些界面元素的显示.有时,也希望通过jQuery调用Scope的某个方法. 比如以下场景: <div> & ...

  7. iOS 跳转到系统指定设置界面

    在需要调转的按钮动作中添加如下的代码,就会跳转到设置中自己的app的设置界面,这里会有通知和位置权限的设置 NSURL * url = [NSURLURLWithString:UIApplicatio ...

  8. IntelliJ IDEA全局内容搜索和替换

      在做项目时,有时会在整个项目里或指定文件夹下进行全局搜索和替换,这是一个很方便功能.使用方法如下: 一.全局搜索 1.使用快捷键Ctrl+Shift+F打开搜索窗口,或者通过点击Edit–> ...

  9. C# windows 桌面控件的扩展

    今天一同事 需要一个Windows from下 GridView的嵌套的控件,于是就去找了以前自己写的一些form 控件,发现居然没有人下载.同时查找以前的下载包也比较费时,于是乎就搞一个文章. 运行 ...

  10. iOS开发-UIView扩展CGRect

    关于UIView的位置都会遇到,一般需要改变UIView的位置,需要先获取原有的frame位置,然后在frame上面修改,有的时候如果只是改变了一下垂直方向的位置,宽度和高度的一种,这种写法很麻烦.下 ...