【Quartz】01 快速上手

技术文章 1年前 (2020) 完美者
2,056 0

标签:png   配置   www   static   两种   dsc   create   hello   adp   

一、Quartz概述

Quartz是用来做定时任务调度的JavaEE框架

需求场景:

1、在每个月末,自动网易云会员续费,或者百度云盘会员续费

2、在迅雷下载完一个超过10G的资源的30秒之后自动关机

也就是说我们希望在某一个特定的时刻,去执行一些事情

 

二、快速入门

POM坐标:

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

打开右侧的Maven菜单工具,可以看到Quartz的依赖项,包含了两个数据源

技术图片

 

编写一个类并且实现Job接口,重写接口的execute方法

package cn.dzz.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @author Echo42
 * @file Quartz
 * @create 2020年09月12日16:53
 * @description
 */
public class HelloQuartz implements Job {
    
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 我们希望执行的逻辑
        System.out.println("Hello Quartz !!!");
    }
}

 

编写可运行的方法【Main或者JunitTest】

package cn.dzz;

import cn.dzz.quartz.HelloQuartz;
import org.junit.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.GregorianCalendar;

/**
 * @author Echo42
 * @file Quartz
 * @create 2020年09月12日16:56
 * @description
 */
public class QuartzTest {

    @Test
    public void testQuartzSample() throws SchedulerException {
        // 1、调度器对象
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
        
        // 2、触发器对象 ,指定执行事件如何触发
        SimpleTrigger simpleTrigger = TriggerBuilder.
                newTrigger(). // 创建新的触发器
                withIdentity("trigger01", "group01"). // 触发器实例的标识信息
                startNow(). // 从什么时候开始触发执行
                withSchedule( // 如何调度执行的规则
                SimpleScheduleBuilder.
                        simpleSchedule().
                        withIntervalInSeconds(10).
                        repeatForever()
                ).
                endAt( // 从什么时候结束执行
                        new GregorianCalendar(2020, 10, 2, 14, 26, 33).
                                getTime()
                ).
                build();

        // 3、职责详细 JobDetail
        JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("trigger01", "group01").build();
        
        // 4、把职责详细对象和触发器对象注入到调度器对象中
        defaultScheduler.scheduleJob(jobDetail, simpleTrigger);
        
        // 5、启动调度器
        defaultScheduler.start();
    }
}

单元测试的结果,没反应?直接结束了

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
 Process finished with exit code 0

换成main执行:

这才有效了。。。。

技术图片

 

执行的上下文参数:

package cn.dzz.quartz;

import org.quartz.*;

/**
 * @author Echo42
 * @file Quartz
 * @create 2020年09月12日16:53
 * @description
 */
public class HelloQuartz implements Job {

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 我们希望执行的逻辑
        System.out.println("Hello Quartz !!!");
        
        // 除此之外,还可以获取调用此Job类的标识 JobDetail jobDetail = jobExecutionContext.getJobDetail(); JobKey jobDetailKey = jobDetail.getKey(); String name = jobDetailKey.getName(); // trigger01 String group = jobDetailKey.getGroup(); // group01
    }
}

 

Quartz的外部配置文件:

# quartz.properties 不可以更改配置文件名称,默认位置classpath目录下面。
# 如果没有此配置文件,Quartz会按照默认配置执行

# 指定调度器名称,非实现类?
org.quartz.scheduler.instanceName = DefaultQuartzScheduler

# 指定线程池实现类
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

# 线程池数量
org.quartz.threadPool.threadCount = 10

# 优先级,默认5
org.quartz.threadPool.threadPriority = 5

# 非持久化job
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

 

核心类:

1、Scheduler  调度器,控制所有调度,Quartz的核心API,管理了所有任务

2、Job  任务,即我们希望Quartz管理的业务逻辑定义

3、JobDetail  任务详细,对Job对象的进一步封装,指定更详细的属性

4、Trigger  触发器,绑定任务,规定任务执行的触发规则

 

三、两种触发器:

SimpleTrigger & CronTrigger

1、SimpleTrigger 以一定时间范围内执行的任务,指定起始时间和截止时间,指定时间间隔与次数

// 2、触发器对象 ,指定执行事件如何触发
SimpleTrigger simpleTrigger = TriggerBuilder.
        newTrigger(). // 创建新的触发器
        withIdentity("trigger01", "group01"). // 触发器实例的标识信息
        startNow(). // 从什么时候开始触发执行
        withSchedule( // 如何调度执行的规则
        SimpleScheduleBuilder.
                simpleSchedule(). //
                withIntervalInSeconds(10).
                repeatForever()
).
endAt( // 从什么时候结束执行
        new GregorianCalendar(2020, 10, 2, 14, 26, 33).
                getTime()
).
build();

2、用来规定更为复杂的触发规则,支持Linux Cron的语法,

只需要Cron表达式即可

private static void cronExpressionQuartzDemo() {
    try {
        Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();

 CronTrigger cronTrigger = TriggerBuilder. newTrigger(). withIdentity("trigger02", "group02"). withSchedule( // cron 表达式 秒 分 时 日 月 周 年 // 年可以省略 // 10月 22日 16时 34分 20秒 // ? 问号表示不明确,但是我们上述的内容可以让Quartz自行推算具体值 CronScheduleBuilder.cronSchedule("20 34 16 22 10 ?") // CronScheduleBuilder.cronSchedule("20 34 16 22 10 ?") 在这个表达式规定这个时刻执行一次 // 把任意的一个表达式计量值 换成 * 表示在这个时间单位上进行重复的执行 // 例如 "* 34 16 22 10 ?" 表示每秒执行 // 同理可以 每分钟,每小时,每天,每个星期,每个月,或者最后到每年 // 使用 */n 表示每时间单位计量值的N倍,再执行 // 例如 "*/2 34 16 22 10 ?" 每两秒执行一次  ).build();

        JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("trigger01", "group01").build();

        defaultScheduler.scheduleJob(jobDetail, null);

        defaultScheduler.start();
    } catch (Exception exception) {
        exception.printStackTrace();
    }
}

Cron表达式详细参考:

https://www.cnblogs.com/yanghj010/p/10875151.html

 

Spring整合Quartz就没再继续写了,配置麻烦

视频参考:

https://www.bilibili.com/video/BV1zz4y1X71Z

 

【Quartz】01 快速上手

标签:png   配置   www   static   两种   dsc   create   hello   adp   

原文地址:https://www.cnblogs.com/mindzone/p/13657572.html

版权声明:完美者 发表于 2020-09-17 23:16:57。
转载请注明:【Quartz】01 快速上手 | 完美导航

暂无评论

暂无评论...