文章目录

  • Spring Boot任务调用
  • 服务器启动时自动执行某个任务
  • 服务器启动后定时自动执行某个任务
  • Spring定时任务之@Scheduled cron表达式
  • 不使用cron
  • 推荐还是使用Cron多功能
  • 实际使用场景


Spring Boot任务调用

服务器启动时自动执行某个任务

SpringBoot提供两种方法,编写一个组件(@Component)实现ApplicationRunner或者实现CommandLineRunner

它两重写的run方法参数列表都不怎么用得到

如果有多个任务指定顺序

@Order(1)注解在组件上就能决定顺序

但是这个标记是Spring的

两种方法实现的接口都是boot的

如何决定多个Filter顺序

filterName字典顺序执行

如何指定任务执行顺序
通过使用@Order注解指定任务执行顺序

我们可以在启动任务时追加数据库等操作

OneTask.java

package vip.javer.task.task;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * Class Describe:
 *
 * @author biuaxia
 * @date 2018/12/14 10:05
 */
@Component
@Order(2)
public class OneTask implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("****Task===One****");
    }
}

TwoTask.java

package vip.javer.task.task;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * Class Describe:
 *
 * @author biuaxia
 * @date 2018/12/14 10:05
 */
@Component
@Order(1)
public class TwoTask implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("****Task===Two****");
    }
}

这里通过设置@Order修改了顺序,所以2先执行,1后执行

服务器启动后定时自动执行某个任务

以前使用Spring时使用第三方组件quartz完成类似需求

有机会可以了解一下Spring与Quartz的整合

而在Boot中内置了status

案例:每隔5s调用任务打印输出当前时间

  1. 新建Task类
  2. 自定义方法
  3. 书写方法逻辑
  4. 在类上@Component
  5. 方法上@Scheduled

```
 @Scheduled(cron=“0/5 * * * * ?”)
 public void exe(){
 sout(“自动执行任务3,时间:”+new Date());
 }
 ```

到了这里怎么启动呢?

  1. 我们在启动类追加@EnableScheduling即可

这样就能启动之后每隔5s打印一次

例如到了5s就执行一次

@Scheduled(cron=“5 * * * * ?”)

例如每到29分5s执行一次

@Scheduled(cron=“5 29 * * * ?”)

Spring定时任务之@Scheduled cron表达式

一个cron表达式至少有6个(也可能7个)有空格分隔的时间元素

按顺序依次为

秒(0-59)

分(0-59)

时(0-23)

天(月)(0-31,但是你需要考虑你月的天数)

月(0-11)

天(星期)(1-7 1=SUN或SUN,MON,TUE,WED,THU,FRI,SAT)

7年份(1970-2099)

字符代表所有可能的值,因此在表达式(月)则表示每月,**在分则表示每分,等。

?字符仅呗用于天(月)和天(星期)两个子表达式,表示不指定值,当两个子表达式其中之一被指定,为了避免冲突需要将另一个子表达式的值设为?

比如有一个为*另一个就是?

**L字符被用于天(月)和天(星期)两个子表达式,它是单词“last”的错写,但在两个子表达式的含义不同 **

  1. 在天(月)子表达式中,L表示一个月的最后一天
  2. 在天(星期)子表达式中,L表示一个星期的最后一天,也就是SAT

如果在L前有具体的内容,他就有其他的含义了

例如6L表示这个月的倒数第六天,F R I L表示这个月的最后一个星期五

注意,在使用L参数时,不要指定列表或范围,因为这会导致问题

/字符用来指定数值的增量

比如说在子表达式(分钟)里面0/15就是从第0分钟开始,每15分钟执行一次

再比如子表达式(分钟)里的3/20表示从第3分钟开始,每20分钟(它和3,23,43的含义一样)执行一次

不使用cron

每隔5000毫秒调用(即5S)@Scheduled(fixedRate=5000)调用一次

@Scheduled(fixedRate=5000,initialDelay=2000)等待2s然后每隔5s调用

推荐还是使用Cron多功能

实际使用场景

  1. 每日天气预报
  2. 用户生日发邮件啥的
  3. 每晚12点汇总账目啥的

如果你使用的Spring版本在3.0以上就可以使用EnableScheduling