Quartz介绍及入门案例

Quartz介绍及入门案例

1. Quartz 任务调度框架

概述

在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说非常广泛:

某些网站会定时发送优惠邮件。
银行系统还款日信用卡催收款。 
某些应用的生日祝福短信等。

完成这些功能都需要用到定时任务调度。那究竟何为定时任务调度,一句话概括就是:基于给定的时间点、给定的时间间隔、给定的执行次数自动执行的任务

JDK的Timer (定时任务只能执行一次,) , Quartz 、 Spring Task 、 (分布式的ElasticJob)

Quartz框架的介绍

在这里插入图片描述
Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间。其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。主要用来执行定时任务,如:定时发送信息、定时生成报表等等。

Quartz框架的主要特点:

· 强大的调度功能,例如丰富多样的调度方法,可以满足各种常规和特殊需求;

· 灵活的应用方式,比如支持任务调度和任务的多种组合,支持数据的多种存储;

· 支持分布式集群,在被Terracotta收购之后,在原来基础上进行了进一步的改造。

任务调用:

  1. 你要干什么
  2. 你什么时候去干(触发器+到时间点马上就会触发)

Quartz使用

步骤:

  1. export_web_manager添加依赖
  2. 编写任务类(你要什么?)
  3. 编写Spring整合Quartz配置
  4. 启动服务

实现:

  1. export_web_manager添加依赖

使用Spring整合Quartz:

 <!--定时任务 -->  
    <dependency> 
      <groupId>org.quartz-scheduler</groupId>  
      <artifactId>quartz</artifactId>  
      <version>2.2.3</version> 
    </dependency>  
  1. 编写任务类

图1:
在这里插入图片描述

package cn.itcast.web.task;

import java.text.SimpleDateFormat;
import java.util.Date;

//任务类: 定义你要做什么
public class MyTask {
    
    

    public void  showTime(){
    
    
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("当前的系统时间:"+simpleDateFormat.format(new Date()));
    }
}


在web.xml配置启动spirng==(已完成)==

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

	<!--启动spring-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:spring/applicationContext-*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
</web-app>
  1. 编写Spring整合Quartz配置
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--1. 定义你要做什么(任务的详情)-->
    <bean id="myTask" class="cn.itcast.web.task.MyTask"/>
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!--目标对象-->
        <property name="targetObject" ref="myTask"/>
        <!--任务对象的方法-->
        <property name="targetMethod" value="showTime"/>

    </bean>


    <!--2. 定义触发器=时间表达式+任务详情(你什么时候做)-->
    <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!--时间表达式: 秒 分 时 日 月 周  年

            注意:
                1. 年是可以省略不写的.
                2. 周与日是冲突,只能写一个。
         -->
        <property name="cronExpression" value="0/2 * * * * ? *"/>
        <!--任务详情-->
        <property name="jobDetail" ref="jobDetail"/>
    </bean>


    <!--3. 把触发器交给任务调度工厂-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <array>
                <ref bean="trigger"/>
            </array>
        </property>
    </bean>

</beans>
  1. 启动服务
    在这里插入图片描述

注意
倘若此处报错
Error creating bean with name ‘jobDetail’: Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean] from ClassLoader [ParallelWebappClassLoader

有可能是导入quartz依赖的版本问题,请看解决方法

小结

  1. quartz 使用步骤

       - 导入依赖
       - 定义一个任务类
       - 配置quartz的核心配置文件
          - 定义任务详情
          - 定义一个触发器
          - 把触发器交给任务调度工厂     
    

2. Quartz 任务调度表达式语法

介绍

​ Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异。
​ 在 UNIX cron 里,要执行的作业(或者说命令)是存放在 cron 表达式中的,在第六个域位置上。Quartz
用 cron 表达式存放执行计划。引用了cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上。
​ 另一个与 UNIX cron 表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(分、时、日、月和周),Quartz提供七个域。表 5.1 列出了Quartz cron 表达式支持的七个域。

语法

特殊符号的含义

特殊字符 意义
* 匹配所有的值。如:*在分钟的字段域里表示 每分钟 每
? 只在日期域和星期域中使用。它被用来指定“非明确的值”
- 指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”
, 指定几个可选值。如:“MON,WED,FRI”在星期域里表示“星期一、星期三、星期五”
/ 指定增量。如:“0/15”在秒域意思是每分钟的0,15,30和45秒。
“5/15”在分钟域表示每小时的5,20,35和50。

Quartz Cron 表达式支持到七个域

日与周,必须有一个问号。否则就会有冲突。

月份和星期的名称是不区分大小写的。FRI 和 fri 是一样的。

举例

表达式意义
"0 0 12 * *?" 每天中午12点触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 0/5 14,18* * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * *? " 在每天下午2点到下午2:05期间的每1分钟触

Memorial Day is 522 days
I miss you
xiaokeai

猜你喜欢

转载自blog.csdn.net/weixin_42914989/article/details/113184721
今日推荐