栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Quartz定时任务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Quartz定时任务

cron表达式

cron表达式是一个字符串, 用来设置定时规则, 由七部分组成, 每部分中间用空格隔开, 每部分的含义如下表所示:

****组成部分****含义****取值范围
第一部分Seconds (秒)0-59
第二部分Minutes(分)0-59
第三部分Hours(时)0-23
第四部分Day-of-Month(天)1-31
第五部分Month(月)0-11或JAN-DEC
第六部分Day-of-Week(星期)1-7(1表示星期日)或SUN-SAT
第七部分Year(年) 可选1970-2099

另外, cron表达式还可以包含一些特殊符号来设置更加灵活的定时规则, 如下表所示:

****符号****含义
?表示不确定的值。当两个子表达式其中一个被指定了值以后,为了避免冲突,需要将另外一个的值设为“?”。例如:想在每月20日触发调度,不管20号是星期几,只能用如下写法:0 0 0 20 * ?,其中最后以为只能用“?”
*代表所有可能的值
,设置多个值,例如”26,29,33”表示在26分,29分和33分各自运行一次任务
-设置取值范围,例如”5-20”,表示从5分到20分钟每分钟运行一次任务
/设置频率或间隔,如"1/15"表示从1分开始,每隔15分钟运行一次任务
L用于每月,或每周,表示每月的最后一天,或每个月的最后星期几,例如"6L"表示"每月的最后一个星期五"
W表示离给定日期最近的工作日,例如"15W"放在每月(day-of-month)上表示"离本月15日最近的工作日"
#表示该月第几个周X。例如”6#3”表示该月第3个周五

为了让大家更熟悉cron表达式的用法, 接下来我们给大家列举了一些例子, 如下表所示:

****cron表达式****含义
*/5 * * * * ?每隔5秒运行一次任务
0 0 23 * * ?每天23点运行一次任务
0 0 1 1 * ?每月1号凌晨1点运行一次任务
0 0 23 L * ?每月最后一天23点运行一次任务
0 26,29,33 * * * ?在26分、29分、33分运行一次任务
0 0/30 9-17 * * ?朝九晚五工作时间内每半小时运行一次任务
0 15 10 ? * 6#3每月的第三个星期五上午10:15运行一次任务
Quartz+spring入门案例

本案例基于Quartz和spring整合的方式使用。具体步骤:

(1)创建maven工程quartzdemo,导入Quartz和spring相关坐标,pom.xml文件如下



    4.0.0
    com.itheima
    quartdemo
    1.0-SNAPSHOT
    
        
            org.springframework
            spring-context-support
            5.0.2.RELEASE
        
        
            org.springframework
            spring-tx
            5.0.2.RELEASE
        
        
            org.quartz-scheduler
            quartz
            2.2.1
        
        
            org.quartz-scheduler
            quartz-jobs
            2.2.1
        
    

(2)自定义一个Job

package com.itheima.jobs;

public class JobDemo {
    public void run(){
        System.out.println("job execute...");
    }
}

(3)提供Spring配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度工厂等



  
    
  
    
        
        
        
        
    
    
    
        
        
        
        
            0/10 * * * * ?
        
    
    
    
        
        
            
                
            
        
    

(4)编写main方法进行测试

package com.itheima.jobs.com.itheima.app;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("spring-jobs.xml");
    }
}

执行上面main方法观察控制台,可以发现每隔10秒会输出一次,说明每隔10秒自定义Job被调用一次。

SpringBoot内置的定时 入门
  1. 添加依赖

    org.springframework.boot
    spring-boot-starter

  1. 启动类上添加@EnableScheduling注解(Scheduling翻译为行程安排)
@SpringBootApplication
@EnableScheduling
public class SpringbootQuartzApplication {
}
  1. 创建定时执行任务的任务类(两种方式)

方式一:

@Component
public class SchedulerTask {
  
    private int count = 0;
    
    @Scheduled(cron = "*/6 * * * * ?")
    private void process(){
        System.out.println("this is scheduler task running " + (count++));
    }    
}

方式二:

@Component
public class SchedulerTask2 {
    
    private static final SimpleDateFormat dateFormat =
            new SimpleDateFormat("HH:mm:ss");
    
    @Scheduled(fixedRate = 6000)
    private void process(){
        System.out.println("now time is " + dateFormat.format(new Date()));
    }    
}
参数说明

@Scheduled 注解可以接受两种定时的设置:

一种是我们常用的 cron="*/6 * * * * ?"
一种是 fixedRate = 6000,两种都可表示固定周期执行定时任务。

fixedRate说明
  • @Scheduled(fixedRate = 6000):上一次开始执行时间点之后 6 秒再执行。

  • @Scheduled(fixedDelay = 6000):上一次执行完毕时间点之后 6 秒再执行。

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

Quartz有四个核心概念
  • Job任务:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的execute 方法中编写所需要定时执行的 Job(任务),JobExecutionContext 类提供了调度应用的一些信息;Job 运行时的信息保存在 JobDataMap 实例中。

  • JobDetail任务详情(job的描述):Quartz 每次调度 Job 时,都重新创建一个 Job 实例,因此它不接受一个 Job 的实例,相反它接收一个 Job 实现类(JobDetail,描述 Job 的实现类及其他相关的静态信息,如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 Job。

  • rigger时间触发规则:是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger 是最适合的选择;而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的 15:00 ~ 16:00 执行调度等。

  • Scheduler调度器:调度器就相当于一个容器,装载着任务和时间触发器,该类是一个接口,代表一个 Quartz 的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ii85xg49-1635320594737)(https://secure.wostatic.cn/static/r3JzK831M3zYZE5pWk93pg/image.png)]

Job 是作业的接口,是任务调度的对象;

JobDetail 用来描述 Job 的实现类及其他相关的静态信息,通过反射调用指定的job;

Trigger 做为作业的定时管理工具,一个 Trigger 只能对应一个作业实例,而一个作业实例可对应多个触发器;

Scheduler 做为定时任务容器,是 Quartz 最上层的东西,它提携了所有触发器和作业,使它们协调工作,每个 Scheduler 都存有 JobDetail 和 Trigger 的注册,一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger

SpringBoot整合Quartz
  1. 导入依赖

    org.springframework.boot
    spring-boot-starter-quartz

  1. 定义一个job,业务逻辑写这里
public class MyJob extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("Quartz ---->  Hello, " + this.name);
    }
}
  1. 构建JobDetail和Trigger(配置类)
@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail myJobDetail(){
        return JobBuilder.newJob(MyJob.class)//PrintTimeJob我们的业务类
                .withIdentity("MyJob")//可以给该JobDetail起一个id
                //每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
                .usingJobData("msg", "Hello Quartz")//关联键值对
                .storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
                .build();
    }
    @Bean
    public Trigger printTimeJobTrigger() {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ?");
        return TriggerBuilder.newTrigger()
                .forJob(myJobDetail())//关联上述的JobDetail
                .withIdentity("quartzTaskService")//给Trigger起个名字
                .withSchedule(cronScheduleBuilder)
                .build();
    }
}
  1. 启动项目就会开始打印了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXNz6YRE-1635320594739)(https://secure.wostatic.cn/static/qd7bUnKE6RYA5mY6mghTk7/image.png)]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/357042.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号