欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Quartz任务调度框架

程序员文章站 2024-03-18 17:14:52
...

Quartz是一个用JAVA编写的开源的作业调度框架,首先来看一下Quartz的核心的API类

  • Job:每一个具体的任务或工作就是一个job,代表具体要执行的内容。
  • JobDetail:JobDetail是一个用于绑定job的任务详情程序,指定了任务的方案和策略,job是任务的具体实现。Spring 中有JobDetailFactoryBean和 MethodInvokingJobDetailFactoryBean两个类作为JobDetail的实现类,如果任务调度只需要执行某个类的某个方法,可以直接使用MethodInvokingJobDetailFactoryBean。
  • Trigger:Trigger是一个触发器,用于指定任务程序执行的时机。在Quartz中有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger使用比较多。Spring中把CronTrigger在CronTriggerFactoryBean这个类中。
  • Scheduler:任务调度容器,一个Scheduler可以注册多个JobDetail和Trigger,但是一个Trigger只能绑定一个JobDetail,当Trigger绑定了JobDetail后就可以被容器调度了。
  • Calender:它是一些日历特定时间点的集合。一个trigger可以包含多个Calendar,以便排除或包含某些时间点
  • ThreadPool: Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。

Cron表达式的(七子表达式)

Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名                 允许的值                        允许的特殊字符
秒                         0-59                               , – * /
分                         0-59                               , – * /
小时                   0-23                                 , – * /
日                         1-31                               , – * ? / L W C
月                         1-12 or JAN-DEC           , – * /
周几                     1-7 or SUN-SAT             , – * ? / L C #      MON  FRI
年 (可选字段)     empty, 1970-2099            , – * /

“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五

Cron表达式范例:
每隔5秒执行一次:* 0/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天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 * * ?

使用Quartz和Spring测试使用任务调度框架

1、创建一个任务类Job

/**
 * 定义晚安任务类
 */
public class GoodNightJob {
    public void goodNight(){
        System.out.println("夜晚,月光和星星都是那么耀眼!");
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:SS");
        String formatDate = simpleDateFormat.format(date);
        System.out.println("当前的时间是:"+formatDate);
        System.out.println("这个时间正好是酣睡的好时机,看看大树和泥土都已经拥抱在一起了,渐渐。。渐渐 。。入梦");
    }
}

2、使用Spring托管Quartz提供的JobDetail、Trigger、Schedualer的具体实现类,以下是spring配置文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->


    <!--定义一个任务类-->
    <bean id="goodNightJob" class="com.yanghao.job.GoodNightJob"></bean>
    <!--定义一个任务描述类-->
    <bean id="goodNightJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="goodNightJob"></property>
        <property name="targetMethod" value="goodNight"></property>
    </bean>
    <!--定义一个触发器-->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="goodNightJobDetail"></property>
        <property name="cronExpression" value="0/10 * * * * ?"></property>
    </bean>
    <!--定义任务调度计划容器-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"></ref>
            </list>
        </property>
    </bean>
</beans>

3、配置Tomcat启动时加载Spring工厂、Spring就会根据配置文件把单例实体Bean托管到工厂中,web.xml配置

<!--加载Sping工厂-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

4、启动tomcat,任务将会按照我们定义的表示式,满足表达式条件时执行

Quartz的工作流程大致如下

使用Quartz任务调度框架


项目具体测试代码参见:https://github.com/dlyanghao/QuartzFrameworkUse