Quartz

一、引言

1、简介

Quartz :http://www.quartz-scheduler.org/
是一个定时任务调度框架
Quartz是要做定时任务的调度,设置好触发时间规则,以及相应的任务(Job)即可。

二、使用

1、导入依赖
<dependencies>
	<dependency>
    	<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			 <version>2.3.2</version>
	</dependency>
</dependencies>
2、定义Job
public class QuartzJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        //创建工作详情
        JobDetail jobDetail = context.getJobDetail();

        //获取工作名称
        String name = jobDetail.getKey().getName();//任务名
        String group = jobDetail.getKey().getGroup();//任务小组

        System.out.println("job执行,job:"+name+"    group:"+group + new Date());
    }
}
3、API测试
public class Triggle {
    public static void main(String[] args) throws Exception {

        //创建调度器
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        //定义一个工作
        JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
                .withIdentity("job1","group1")
                .build();

        //定义一个Trigger,触发条件类
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()//一旦加入调度器,立即生效,即开始计时
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().
                        withIntervalInSeconds(2).//每隔两秒执行一次
                        repeatForever())//一直执行
                .endAt(new GregorianCalendar(2020, 5,
                        30, 10, 1, 1).
                        getTime())//设置结束时间
                .build();

        //在调度器中加入任务和触发器
        scheduler.scheduleJob(jobDetail, trigger);

        //启动任务调度器
        scheduler.start();
    }
}
4、配置
# 指定调度器名称,实际类型为:QuartzScheduler
org.quartz.scheduler.instanceName = MyScheduler
# 指定连接池
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 连接池线程数量
org.quartz.threadPool.threadCount = 11
# 优先级
org.quartz.threadPool.threadPriority = 5
# 不持久化job
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
5、核心类说明
  1. Scheduler:调度器。所有的调度都由调度器来完成,相当于Quartz的大脑,所有任务都由它来管理。
  2. Job:任务,即像定时执行的事情。
  3. JobDetail:基于Job,进一步进行包装。其中关联一个Job,并为其指定更详细的属性,比如标识等。
  4. Trigger:触发器,可以给某个指定任务。指定任务的触发机制。

三、触发器Trigger

1、SimpleTrigger

以一定的时间间隔执行的任务(单位:毫秒)。

  • 指定起始和截至时间(时间段)
  • 指定时间间隔、执行次数
//定义一个SimpleTrigger,触发条件类
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "group1")
                .startNow()//一旦加入调度器,立即生效,即开始计时
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().
                        withIntervalInSeconds(2).//每隔两秒执行一次
//                        repeatForever())//一直执行
                        withRepeatCount(3))//执行次数不超过3次
                .endAt(new GregorianCalendar(2020, 5, 30, 16, 1, 1).
        		getTime())//设置结束时间
        		.build();
2、CronTrigger

适合于更复杂的任务,它支持类型于Linux Cron的语法

  • 指定Cron表达式即可
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity("cronTrigger1","group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("*/2 36 10 30 6 ?"))
                .build();
Cron表达式组成(重点)

“秒 分 时 日 月 周 年”,其中“年”可选,一般不指定。

如:“10 20 15 30 6 ?” 表示 6月30日15点20分10秒,周几不确定。

  • 秒 允许值:0~59
  • 分钟 允许值:0~59
  • 小时 允许值:0~23
  • 日期 允许值:1~31
  • 月份 允许值:1~12
  • 星期 允许值:1~7
  • 年份(可选)

特殊符号

(*) 对应时间域的每一个时刻
(?)通常只在日期和星期字段使用,指定为“不确定值”
(-)表达一个范围,10-12,即10,11,12
(,)表达一个列表式,10,23,8,即10,23,8
(/)x/y表达一个等步长序列,x为起始值,y为增量步长值,0/15,即1,15,30,45,同样,5/15,即5,20,35,50
(#)只用在星期字段中,“4#2”,即第二个星期三,“5#4”,即第四个星期四
(L)只在日期和星期字段使用,代表Last,在星期中表示星期六,等同于7;在日期中表示一个月的最后一天,如1月的31号,4月的30号
(W)只在日期字段,是对前导日期的修饰,表示离该日期最近的工作日,15W,假如15号是星期六,则15W匹配14号星期五;假如15号是星期日,则15W匹配16号星期一,但注意,关联日期不能跨月
(LW)在日期字段里组合使用,当月的最后一个工作日

四、Spring整合Quartz(重点)

1、导入依赖
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>
		<version>5.2.6.RELEASE</version>
	</dependency>

	 <dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-tx</artifactId>
		<version>5.2.6.RELEASE</version>
	</dependency>

	<dependency>
		<groupId>org.quartz-scheduler</groupId>
		<artifactId>quartz</artifactId>
		<version>2.3.2</version>
	</dependency>
</dependencies>
2、定义Job类
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("job执行:" + new Date());
    }
}
3、配置

调度器 SchedulerFactoryBean
触发器 CronTriggerFactoryBean
JobDetail JobDetailFactoryBean

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--
        spring整合Quartz进行配置的步骤:
        1.定义工作任务的Job;
        2.定义触发器Trigger,并将触发器与工作任务绑定;
        3.定义调度器,并将触发器注册到调度器
      -->

    <!--  1.定义工作任务的bean  也可以使用MethodInvokingJobDetailFactoryBean-->
    <bean name="job" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="name" value="job1"></property>
        <property name="group" value="group1"></property>
        <property name="jobClass" value="com.job.MyJob"></property>
    </bean>

    <!--  2.定义触发器Trigger  -->
    <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="name" value="trigger1"></property>
        <property name="group" value="group1"></property>
        <property name="jobDetail" ref="job"></property>
        <property name="cronExpression" value="* * * * * ?"></property>
    </bean>

    <!--  3.定义调度器,并将trigger注册到调度器  -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="trigger"/>
            </list>
        </property>
        <!--    添加 quartz 配置    -->
        <property name="quartzProperties">
            <value>
                # 指定调度器名称,实际类型为:QuartzScheduler
                org.quartz.scheduler.instanceName = MyScheduler
                # 指定连接池
                org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
                # 连接池线程数量
                org.quartz.threadPool.threadCount = 11
                # 优先级
                org.quartz.threadPool.threadPriority = 5
                # 不持久化job
                org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
            </value>
        </property>
    </bean>

</beans>
4、操作
4.1 启动任务
  //工厂启动,任务启动
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
4.2 删除任务
scheduler.deleteJob(JobKey.jobKey("job1","group1"));
4.3 暂停 恢复
   scheduler.pauseJob(JobKey.jobKey("job1","group1"));
    scheduler.resumeJob(JobKey.jobKey("job1","group1"));
4.4 批量操作
GroupMatcher<JobKey> group1 = GroupMatcher.groupEquals("group1");
scheduler.pauseJobs(group1);
scheduler.resumeJobs(group1);
### Quartz 调度框架使用指南 #### 主要概念和组件 Quartz 是一个强大的任务调度框架,用于执行定时任务。它提供了比 `java.util.Timer` 更多的功能,例如持久化作业、复杂的触发器机制以及高效的作业管理能力[^2]。 以下是 Quartz 的主要组成部分及其作用: - **Job**: 表示需要执行的任务逻辑。开发者可以通过实现 `org.quartz.Job` 接口来定义自己的任务。 - **Trigger**: 定义何时以及如何触发某个 Job 执行。常见的 Trigger 类型有 SimpleTrigger 和 CronTrigger。 - **Scheduler**: 负责管理和协调 Jobs 和 Triggers 的执行。 - **JobStore**: 存储运行时信息,包括 Scheduler、Triggers、JobDetails 以及其他元数据[^5]。 #### 快速入门步骤 为了快速上手并掌握 Quartz 框架的核心功能,建议按以下顺序学习相关文档和资料: 1. 阅读官方文档中的 Introduction 部分,理解 Quartz 的基本概念和核心组件的工作原理[^1]。 2. 浏览 Tutorials & Examples 部分的内容,跟随教程完成简单的配置和编码练习。 3. 当遇到特定问题时,查阅 Configuration Reference 或者 API Documentation 获取详细的解决方法。 #### 基础使用案例 下面是一个简单例子展示如何创建一个 Job 并将其绑定到一个 Trigger 上进行调度: ```java import org.quartz.*; import java.text.SimpleDateFormat; import java.util.Date; public class HelloJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello! The time is " + new SimpleDateFormat("HH:mm:ss").format(new Date())); // 可以通过 JobExecutionContext 访问 Quartz 运行环境和其他细节数据 String jobName = context.getJobDetail().getKey().getName(); System.out.println("Executing job: " + jobName); } } // 创建 JobDetail 实例 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build(); // 设置触发时间 (每十秒一次) SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(scheduleBuilder) .build(); // 启动调度器 try (Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler()) { scheduler.start(); scheduler.scheduleJob(job, trigger); Thread.sleep(60_000); // Keep the application running for a minute to see jobs executing. } catch (SchedulerException | InterruptedException e) { throw new RuntimeException(e.getMessage(), e); } ``` 上述代码展示了如何定义一个名为 `HelloJob` 的任务,并设置其每隔十秒钟被执行一次。此外还演示了如何启动调度器并将该任务加入其中[^4]。 #### 数据访问与上下文传递 在实际应用中可能还需要向 Job 中传入额外参数或者获取当前执行状态的信息。这可以通过 `JobDataMap` 来实现,在构建 JobDetail 或 Trigger 时附加所需的数据项即可。另外值得注意的是,每一个正在执行的 Job 都会获得一个对应的 `JobExecutionContext` 对象实例,借助它可以方便地取得关于此次调用的各种属性值,比如所属组名、关联触发条件等等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值