添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
跑龙套的红烧肉  ·  reactjs - Can't find ...·  11 月前    · 
悲伤的山羊  ·  Java Web学习(1): ...·  1 年前    · 
一身肌肉的砖头  ·  Hibernate·  1 年前    · 
爱玩的登山鞋  ·  C语言 ...·  1 年前    · 
@Scheduled(cron = "0/5 * * * * ?") public void setScheduleTaskOne(){ System.out.println("执行静态定时任务时间(One):"+ LocalDateTime.now()); * 方式二 * 设置定时任务 * @param * @return @Scheduled(fixedRate = 5000) public void setScheduleTaskTwo(){ System.out.println("执行静态定时任务时间(Two):"+ LocalDateTime.now());

运行结果:

使用注解 @Scheduled 设置任务时间的 cron表达式:

(1)cron表达式常用的七个参数 * * * * * * *:

秒(0~59):0/5:每隔五秒

分(0~59):0/1:每隔一分钟

时(0~23):0/1:每隔一小时

日(1~31):

月(1~11):

星期(1~7):1表示星期天

年:可留空

(2)每个域(*)使用的符号

*:表示任意值,如在second域中使用*,表示每秒都会触发定时任务

?:只能在日或星期中使用,表示任意值

-:表示范围,如在second域中使用5-20,表示5秒到20秒每秒都会触发定时任务

/:表示起始时间开始触发,然后每隔固定时间触发一次,如在second域中5/20,表示在5秒触发一次定时任务后,间隔20秒后的第25秒触发定时任务,再间隔20秒后的第45秒触发定时任务

,:表示列出枚举值,如在second域中使用5,20,表示在第五秒和第20秒都会触发定时任务

L:表示最后,只能在日或星期中使用,例如在星期域中使用5L,表示最后一个星期4触发任务

W:表示有效工作日(星期一到星期五),只能在日域中使用,系统将在离指定日期的最近的有效工作日触发事件,不会跨月

LW:表示该月的最后一个工作日

#:用于确定每个月第几个星期几,只能出现在星期域,例如4#2,表示某月的第二个星期三

缺点:在修改定时任务执行周期时,需要重启应用才会生效

(3)@Scheduled(fixedRate = 5000) 控制定时

@Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行

@Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行

@Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按 fixedRate 的规则每5秒执行一次

2、基于接口SchedulingConfigurer(动态)

(1)导入依赖包

        <!--添加Web依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--添加MySql依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--添加MybatisPlus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

(2)实体类

@TableName(value = "cron")
@Data
public class Cron {
    private String cronId;
    private String cron;

(3)mapper接口

@Mapper
public interface CronMapper extends BaseMapper<Cron> {

(4)定时任务类

@EnableScheduling
@Configuration
public class DynamicScheduleTask implements SchedulingConfigurer {
    @Autowired
    CronMapper cronMapper;
     * 接口方式
     * @param
     * @return
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(
                //1、添加任务内容(Runnable)
                () -> System.out.println("执行动态定时任务:"+ LocalDateTime.now().toLocalTime()),
                //2、设置执行周期(Trigger)
                triggerContext -> {
                    //从数据库获取执行周期
                    String cron = cronMapper.selectOne(new LambdaQueryWrapper<Cron>().eq(Cron::getCronId, "1")).getCron();
                    if (StringUtils.isEmpty(cron)){
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);

(5)数据库

CREATE TABLE `cron`  (
  `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  `cron` varchar(30) NOT NULL  
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

 (6)运行结果

3、多线程定时任务

@EnableAsync
@EnableScheduling
@Configuration
public class MultithreadScheduleTask {
    @Async
    @Scheduled(fixedDelay = 1000)  //间隔1秒
    public void first() throws InterruptedException {
        System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
        Thread.sleep(1000 * 10);
    @Async
    @Scheduled(fixedDelay = 2000)
    public void second() {
        System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?