0
点赞
收藏
分享

微信扫一扫

Quartz之基本使用

互联网码农 2022-02-10 阅读 48
p2plinqgnu

一、定时任务含义

二、搭建项目

1、新建模块

2、导入依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

3、Scheduled(调度器)创建定时任务 

在SpringBoot的启动类(Quartz01Application)类中加⼊ @EnableScheduling 注解,启⽤定时任务的配置

4、创建执行类

package com.lv.code;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@Slf4j
public class Task {

    @Scheduled(fixedRate = 1000)
    public void test(){
        log.warn("现在时间:" + LocalDateTime.now());
    }
    

}

5、测试

每秒执行一次:

package com.lv.code;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Quartz01ApplicationTests {

    @Test
    void contextLoads() {
        while (true){
            
        }
    }

}

 6、Scheduled参数

cron表达式

cron表达式是一个字符串,以5或者6个空格隔开(示例中是被5个空格隔开),字符串被切割为6个或者7个域,每个域都代表不同的含义

注:日与星期不能同时出现,会矛盾,可以其中一个填?

星期里,1表示的是星期天,2表示的是星期一,以此类推,7表示的是星期六
?只存在于某天或某星期中,且不能同时存在(还不支持同时指定某天和星期)
'L'和'W'字符也可以在日期字段中组合以产生'LW',这转换为“最后一个工作日”
法定字符以及月份和星期的名称不区分大小写,如MON 与mon相同

 每个域都可以用数字表示,还可以出现如下特殊字符

例子:

二、Quartz集成

1、Quartz创建定时任务

两种任务存储方式:这期内容讲解的是内存方式

2、导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

3、测试类

Quartz01ApplicationTests:

package com.lv.code;

import org.junit.jupiter.api.Test;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;

@SpringBootTest
class Quartz01ApplicationTests {

    @Test
    void contextLoads() throws Exception{
//        1、实例化调度器工厂
        SchedulerFactory factory=new StdSchedulerFactory();
//        2、得到调度器
        Scheduler scheduler = factory.getScheduler();
//        3、创建任务  newJob为静态方法,按住Alt+Enter,选择导入static方法
        JobDetail jobDetail = newJob(MyJob.class)
//                描述
                .withDescription("开年大扫除")
//                定义任务的主键:context.getJobDetail().getKey() = name + group,在同样的分组不能出现相同的名字,不同的名字则可以
                .withIdentity("大扫除", "厕所")
                .usingJobData("name", "王阿姨")
//                同样可以用集合
//                JobDataMap jobDataMap=jobDetail.getJobDataMap();
//                jobDataMap.put("name","xx");
//                构建出来,一定要写
                .build();
//        4、创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withDescription("大扫除触发器")
                .withIdentity("大扫除", "厕所")
                .startAt(new Date())
//                .withSchedule(
//                        simpleSchedule()
//                        .withIntervalInSeconds(10)
                                重复次数
//                        .withRepeatCount(10) //SimpleTrigger.REPEAT_INDEFINITELY
//                )
//        基于 Cron 表达式的触发器 CronTrigger
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("* * * * * ?")
                )
                .build();
//      5、将触发器和任务绑定到调度器
        scheduler.scheduleJob(jobDetail, trigger);
//        6、启动调度器
        scheduler.start();
    }

}

4、Job 定时任务

新建Task 类: 

package com.lv.code;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@Slf4j
public class Task {

    @Scheduled(cron = "10 10 * * * ?")
    public void test(){
        log.warn("现在时间:" + LocalDateTime.now());
    }


}

5、测试结果

 

本期内容结束~~~~

举报

相关推荐

0 条评论