• 【Quartz】


    一、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表达式即可,关于Cron表达式的详细介绍:

    https://www.cnblogs.com/yanghj010/p/10875151.html
  • 相关阅读:
    【转】The final local variable xxx cannot be assigned, since it is defined in an enclosing type
    Android开发UI之手动显示和隐藏软键盘
    ListView使用CursorAdapter增加和删除item
    转:LayoutInflater作用及使用
    Android开发之ContentValues
    Android开发:向下一个activity传递数据,返回数据给上一个activity
    Android开发之bug-No Activity found to handle Intent
    Android学习Service中遇到的问题
    You must supply a layout_width attribute的错误原因及解决办法
    Android:EditText 属性
  • 原文地址:https://www.cnblogs.com/mindzone/p/13657572.html
Copyright © 2020-2023  润新知