使用Quartz任务调度框架

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的工作流程大致如下



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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值