Quartz入门,让你快速开始使用Quartz

1 篇文章 0 订阅
1 篇文章 0 订阅

quartz简单入门

为什么要使用quartz

quartz一般用于我们来执行分布式的定时任务,那为什么不适用spring自带的ThreadPoolTaskScheduler进行实现呢?

quartz相对与ThreadPoolTaskScheduler的不同

ThreadPoolTaskScheduler:当使用spring自带的定时任务线程调用类时,不同的服务器之间使用的是一样的代码,而且他的配置是在内存当中,分布式情况下不能实现内存共享。使用在自动运行的时候会执行重复的操作,比如a服务器对某数据进行修改,b服务器并不知道a服务器已经做了这件事,又执行了一次重复的操作

Quartz:quartz的Job是使用数据库来存储的,当我们运行后会在表中存入数据。所有的定时任务在进行操作时会先访问数据库看看任务的状态,当已经运行就没必要继续运行了,如果没有运行则对任务进行加锁,运行完了后再修改状态。

所以在分布式环境下我们需要选择使用quartz来实现定时任务,那应该如何使用呢?分以下几步

1.运行sql

运行以下sql会自动创建我们需要的表

#
 # In your Quartz properties file, you'll need to set
 # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
 #
 #
 # By: Ron Cordell - roncordell
 #  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
 ​
 DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
 DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
 DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
 DROP TABLE IF EXISTS QRTZ_LOCKS;
 DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
 DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
 DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
 DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
 DROP TABLE IF EXISTS QRTZ_TRIGGERS;
 DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
 DROP TABLE IF EXISTS QRTZ_CALENDARS;
 ​
 CREATE TABLE QRTZ_JOB_DETAILS(
 SCHED_NAME VARCHAR(120) NOT NULL,
 JOB_NAME VARCHAR(190) NOT NULL,
 JOB_GROUP VARCHAR(190) NOT NULL,
 DESCRIPTION VARCHAR(250) NULL,
 JOB_CLASS_NAME VARCHAR(250) NOT NULL,
 IS_DURABLE VARCHAR(1) NOT NULL,
 IS_NONCONCURRENT VARCHAR(1) NOT NULL,
 IS_UPDATE_DATA VARCHAR(1) NOT NULL,
 REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
 JOB_DATA BLOB NULL,
 PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_TRIGGERS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 TRIGGER_NAME VARCHAR(190) NOT NULL,
 TRIGGER_GROUP VARCHAR(190) NOT NULL,
 JOB_NAME VARCHAR(190) NOT NULL,
 JOB_GROUP VARCHAR(190) NOT NULL,
 DESCRIPTION VARCHAR(250) NULL,
 NEXT_FIRE_TIME BIGINT(13) NULL,
 PREV_FIRE_TIME BIGINT(13) NULL,
 PRIORITY INTEGER NULL,
 TRIGGER_STATE VARCHAR(16) NOT NULL,
 TRIGGER_TYPE VARCHAR(8) NOT NULL,
 START_TIME BIGINT(13) NOT NULL,
 END_TIME BIGINT(13) NULL,
 CALENDAR_NAME VARCHAR(190) NULL,
 MISFIRE_INSTR SMALLINT(2) NULL,
 JOB_DATA BLOB NULL,
 PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
 FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
 REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 TRIGGER_NAME VARCHAR(190) NOT NULL,
 TRIGGER_GROUP VARCHAR(190) NOT NULL,
 REPEAT_COUNT BIGINT(7) NOT NULL,
 REPEAT_INTERVAL BIGINT(12) NOT NULL,
 TIMES_TRIGGERED BIGINT(10) NOT NULL,
 PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
 FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
 REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_CRON_TRIGGERS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 TRIGGER_NAME VARCHAR(190) NOT NULL,
 TRIGGER_GROUP VARCHAR(190) NOT NULL,
 CRON_EXPRESSION VARCHAR(120) NOT NULL,
 TIME_ZONE_ID VARCHAR(80),
 PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
 FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
 REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_SIMPROP_TRIGGERS
   (
     SCHED_NAME VARCHAR(120) NOT NULL,
     TRIGGER_NAME VARCHAR(190) NOT NULL,
     TRIGGER_GROUP VARCHAR(190) NOT NULL,
     STR_PROP_1 VARCHAR(512) NULL,
     STR_PROP_2 VARCHAR(512) NULL,
     STR_PROP_3 VARCHAR(512) NULL,
     INT_PROP_1 INT NULL,
     INT_PROP_2 INT NULL,
     LONG_PROP_1 BIGINT NULL,
     LONG_PROP_2 BIGINT NULL,
     DEC_PROP_1 NUMERIC(13,4) NULL,
     DEC_PROP_2 NUMERIC(13,4) NULL,
     BOOL_PROP_1 VARCHAR(1) NULL,
     BOOL_PROP_2 VARCHAR(1) NULL,
     PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
     FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
     REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_BLOB_TRIGGERS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 TRIGGER_NAME VARCHAR(190) NOT NULL,
 TRIGGER_GROUP VARCHAR(190) NOT NULL,
 BLOB_DATA BLOB NULL,
 PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
 INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
 FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
 REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_CALENDARS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 CALENDAR_NAME VARCHAR(190) NOT NULL,
 CALENDAR BLOB NOT NULL,
 PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 TRIGGER_GROUP VARCHAR(190) NOT NULL,
 PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_FIRED_TRIGGERS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 ENTRY_ID VARCHAR(95) NOT NULL,
 TRIGGER_NAME VARCHAR(190) NOT NULL,
 TRIGGER_GROUP VARCHAR(190) NOT NULL,
 INSTANCE_NAME VARCHAR(190) NOT NULL,
 FIRED_TIME BIGINT(13) NOT NULL,
 SCHED_TIME BIGINT(13) NOT NULL,
 PRIORITY INTEGER NOT NULL,
 STATE VARCHAR(16) NOT NULL,
 JOB_NAME VARCHAR(190) NULL,
 JOB_GROUP VARCHAR(190) NULL,
 IS_NONCONCURRENT VARCHAR(1) NULL,
 REQUESTS_RECOVERY VARCHAR(1) NULL,
 PRIMARY KEY (SCHED_NAME,ENTRY_ID))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_SCHEDULER_STATE (
 SCHED_NAME VARCHAR(120) NOT NULL,
 INSTANCE_NAME VARCHAR(190) NOT NULL,
 LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
 CHECKIN_INTERVAL BIGINT(13) NOT NULL,
 PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
 ENGINE=InnoDB;
 ​
 CREATE TABLE QRTZ_LOCKS (
 SCHED_NAME VARCHAR(120) NOT NULL,
 LOCK_NAME VARCHAR(40) NOT NULL,
 PRIMARY KEY (SCHED_NAME,LOCK_NAME))
 ENGINE=InnoDB;
 ​
 CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
 CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
 ​
 CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
 CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
 CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
 CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
 CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
 CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
 CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
 CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
 CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
 CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
 CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
 CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
 ​
 CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
 CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
 CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
 CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
 CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
 CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
 ​
 commit;

2.导入依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-quartz</artifactId>
 </dependency>

3.配置yaml

 spring:
   #quartz配置
   quartz:
     #采用jdbc的方式进行存储Job
     job-store-type: jdbc
     #任务调度器名称
     scheduler-name: fisherScheduler
     #配置文件参数
     properties:
       org:
         quartz:
           scheduler:
             #任务id自动生成
             instanceId: AUTO
         jobStore:
           #操作数据库的类
           class: org.quartz.impl.jdbcjobstore.JobStoreTx
           #数据库驱动
           driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
           #是否使用集群
           isClustered: true
           #线程池配置
           threadPool:
             class: org.quartz.simpl.SimpleThreadPool
             threadCount: 5

4.quartz简单工作流程

Quartz的实现是基于接口Schedular进行实现的,在进行Quartz运行之前我们需要实现如下的配置

  1. 定义一个工作(Job)

     public class TestJob implements Job {
         @Override
         public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
             //输出当前线程名字+正在运行
             System.out.println(Thread.currentThread().getName() + "正在运行!");
         }
     }

    这一步可以通过实现接口Job中execute方法达成

  2. 配置Job的详细信息(JobDetail)

    创建一个quartz的配置类
    JobDetail负责对Job的基本信息和配置进行填充
    Trigger负责设置Job的重复间隔和开始间隔等配置

     @Configuration
     public class QuartzConfig {
     ​
         /**
          * FactoryBean的作用是帮我们更方便的实例化Bean
          * 当我们需要JobDetail时,向当前方法注入JobDetailFactoryBean就会为我们传入一个JobDetail的实例
          */
         @Bean
         public JobDetailFactoryBean testJobDetailFactory(){
             JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
             //设置工厂注入进spring容器的bean名称
             jobDetailFactory.setBeanName("testJobDetail");
             //指定Job的名称
             jobDetailFactory.setName("testJob");
             //设置当前Job的组
             jobDetailFactory.setGroup("jobDetailTestGroup");
             //设置当前执行的Job,注入之前编写好的Job
             jobDetailFactory.setJobClass(TestJob.class);
             //指定作业的持久性,即即使没有触发器不再指向它,它是否仍应存储在作业存储中。
             jobDetailFactory.setDurability(true);
             //为此作业设置恢复标志,即如果遇到“恢复”或“故障转移”情况,是否应重新执行作业。
             jobDetailFactory.setRequestsRecovery(true);
             return jobDetailFactory;
         }
     ​
         /**
          * 设置定时任务
          */
         @Bean
         public SimpleTriggerFactoryBean testJobTrigger(JobDetail testJobDetail){
             SimpleTriggerFactoryBean triggerFactoryBean = new SimpleTriggerFactoryBean();
             //
             triggerFactoryBean.setBeanName("testJobTrigger");
             //指定触发器的名称
             triggerFactoryBean.setName("testJobTrigger");
             //指定触发器的组。
             triggerFactoryBean.setGroup("testJobTriggerGroup");
             //设置应与此触发器关联的JobDetail。
             triggerFactoryBean.setJobDetail(testJobDetail);
             //设置启动延迟(以毫秒为单位)。
             triggerFactoryBean.setStartDelay(1000);
             //指定此触发器的执行时间间隔。
             triggerFactoryBean.setRepeatInterval(10000);
             //设置触发器的Job的状态
             triggerFactoryBean.setJobDataMap(new JobDataMap());
             return triggerFactoryBean;
         }
     ​
     }

    5.启动项目

现在就能看见我们的定时任务已经开始执行了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值