• quartz 使用总结


    quartz是一个任务调度框架,具体的用途比如说,我想我的程序在每天的3点干什么事,每隔多长时间做一件什么事。quartz框架就可以完美地解决这些。

    1.xml配置方式

    首先我是用spring来管理的的项目的,所以我直接在spring的配置文件中配置我的任务即可!(我是用的quartz2.2.1版本),需要俩包,quartz的包,和slf4j-api-1.7.25.jar

    废话不多述,直接上代码

    <bean id="job_1" class="com.yiwei.mytask.Job1" />
    <bean id="job1"
            class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="job_1" />
            <property name="targetMethod" value="doJob1" />
            <property name="concurrent" value="false" />
    </bean>
    <!-- 调度触发器 -->
        <bean id="cronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="job1" />  
            <property name="cronExpression" value="0/5 * * * * ?" />
    </bean> 
    <!-- 调度工厂 -->
        <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <!-- 触发器列表 -->
                    <ref bean="cronTrigger1" />
                    
                </list>
            </property>
        </bean>  

    第一个bean 中的id =“job_1” 是指这个任务的执行类,然后调度任务时候,必须把触发器的id写到ref中去。才能完成调用。

    然而,用这种方式写,又一个很大的弊端,就是不够灵活。接下来介绍数据库方式持久化。

    2.数据库方式

    在 /docs/dbTables 目录下存放了几乎所有数据库的的SQL脚本,这里的 是解压 Quartz 分发包后的目录。我们使用常用oracle数据库,下面是示例sql脚本代码

    --
    -- A hint submitted by a user: Oracle DB MUST be created as "shared" and the 
    -- job_queue_processes parameter  must be greater than 2
    -- However, these settings are pretty much standard after any
    -- Oracle install, so most users need not worry about this.
    --
    -- Many other users (including the primary author of Quartz) have had success
    -- runing in dedicated mode, so only consider the above as a hint ;-)
    --
    
    delete from qrtz_fired_triggers;
    delete from qrtz_simple_triggers;
    delete from qrtz_simprop_triggers;
    delete from qrtz_cron_triggers;
    delete from qrtz_blob_triggers;
    delete from qrtz_triggers;
    delete from qrtz_job_details;
    delete from qrtz_calendars;
    delete from qrtz_paused_trigger_grps;
    delete from qrtz_locks;
    delete from qrtz_scheduler_state;
    
    drop table qrtz_calendars;
    drop table qrtz_fired_triggers;
    drop table qrtz_blob_triggers;
    drop table qrtz_cron_triggers;
    drop table qrtz_simple_triggers;
    drop table qrtz_simprop_triggers;
    drop table qrtz_triggers;
    drop table qrtz_job_details;
    drop table qrtz_paused_trigger_grps;
    drop table qrtz_locks;
    drop table qrtz_scheduler_state;
    
    
    CREATE TABLE qrtz_job_details
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        JOB_NAME  VARCHAR2(200) NOT NULL,
        JOB_GROUP VARCHAR2(200) NOT NULL,
        DESCRIPTION VARCHAR2(250) NULL,
        JOB_CLASS_NAME   VARCHAR2(250) NOT NULL, 
        IS_DURABLE VARCHAR2(1) NOT NULL,
        IS_NONCONCURRENT VARCHAR2(1) NOT NULL,
        IS_UPDATE_DATA VARCHAR2(1) NOT NULL,
        REQUESTS_RECOVERY VARCHAR2(1) NOT NULL,
        JOB_DATA BLOB NULL,
        CONSTRAINT QRTZ_JOB_DETAILS_PK PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
    );
    CREATE TABLE qrtz_triggers
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        TRIGGER_NAME VARCHAR2(200) NOT NULL,
        TRIGGER_GROUP VARCHAR2(200) NOT NULL,
        JOB_NAME  VARCHAR2(200) NOT NULL, 
        JOB_GROUP VARCHAR2(200) NOT NULL,
        DESCRIPTION VARCHAR2(250) NULL,
        NEXT_FIRE_TIME NUMBER(13) NULL,
        PREV_FIRE_TIME NUMBER(13) NULL,
        PRIORITY NUMBER(13) NULL,
        TRIGGER_STATE VARCHAR2(16) NOT NULL,
        TRIGGER_TYPE VARCHAR2(8) NOT NULL,
        START_TIME NUMBER(13) NOT NULL,
        END_TIME NUMBER(13) NULL,
        CALENDAR_NAME VARCHAR2(200) NULL,
        MISFIRE_INSTR NUMBER(2) NULL,
        JOB_DATA BLOB NULL,
        CONSTRAINT QRTZ_TRIGGERS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
        CONSTRAINT QRTZ_TRIGGER_TO_JOBS_FK FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) 
          REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP) 
    );
    CREATE TABLE qrtz_simple_triggers
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        TRIGGER_NAME VARCHAR2(200) NOT NULL,
        TRIGGER_GROUP VARCHAR2(200) NOT NULL,
        REPEAT_COUNT NUMBER(7) NOT NULL,
        REPEAT_INTERVAL NUMBER(12) NOT NULL,
        TIMES_TRIGGERED NUMBER(10) NOT NULL,
        CONSTRAINT QRTZ_SIMPLE_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
        CONSTRAINT QRTZ_SIMPLE_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    );
    CREATE TABLE qrtz_cron_triggers
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        TRIGGER_NAME VARCHAR2(200) NOT NULL,
        TRIGGER_GROUP VARCHAR2(200) NOT NULL,
        CRON_EXPRESSION VARCHAR2(120) NOT NULL,
        TIME_ZONE_ID VARCHAR2(80),
        CONSTRAINT QRTZ_CRON_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
        CONSTRAINT QRTZ_CRON_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
          REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    );
    CREATE TABLE qrtz_simprop_triggers
      (          
        SCHED_NAME VARCHAR2(120) NOT NULL,
        TRIGGER_NAME VARCHAR2(200) NOT NULL,
        TRIGGER_GROUP VARCHAR2(200) NOT NULL,
        STR_PROP_1 VARCHAR2(512) NULL,
        STR_PROP_2 VARCHAR2(512) NULL,
        STR_PROP_3 VARCHAR2(512) NULL,
        INT_PROP_1 NUMBER(10) NULL,
        INT_PROP_2 NUMBER(10) NULL,
        LONG_PROP_1 NUMBER(13) NULL,
        LONG_PROP_2 NUMBER(13) NULL,
        DEC_PROP_1 NUMERIC(13,4) NULL,
        DEC_PROP_2 NUMERIC(13,4) NULL,
        BOOL_PROP_1 VARCHAR2(1) NULL,
        BOOL_PROP_2 VARCHAR2(1) NULL,
        CONSTRAINT QRTZ_SIMPROP_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
        CONSTRAINT QRTZ_SIMPROP_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
          REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    );
    CREATE TABLE qrtz_blob_triggers
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        TRIGGER_NAME VARCHAR2(200) NOT NULL,
        TRIGGER_GROUP VARCHAR2(200) NOT NULL,
        BLOB_DATA BLOB NULL,
        CONSTRAINT QRTZ_BLOB_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
        CONSTRAINT QRTZ_BLOB_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
            REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
    );
    CREATE TABLE qrtz_calendars
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        CALENDAR_NAME  VARCHAR2(200) NOT NULL, 
        CALENDAR BLOB NOT NULL,
        CONSTRAINT QRTZ_CALENDARS_PK PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
    );
    CREATE TABLE qrtz_paused_trigger_grps
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        TRIGGER_GROUP  VARCHAR2(200) NOT NULL, 
        CONSTRAINT QRTZ_PAUSED_TRIG_GRPS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
    );
    CREATE TABLE qrtz_fired_triggers 
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        ENTRY_ID VARCHAR2(95) NOT NULL,
        TRIGGER_NAME VARCHAR2(200) NOT NULL,
        TRIGGER_GROUP VARCHAR2(200) NOT NULL,
        INSTANCE_NAME VARCHAR2(200) NOT NULL,
        FIRED_TIME NUMBER(13) NOT NULL,
        SCHED_TIME NUMBER(13) NOT NULL,
        PRIORITY NUMBER(13) NOT NULL,
        STATE VARCHAR2(16) NOT NULL,
        JOB_NAME VARCHAR2(200) NULL,
        JOB_GROUP VARCHAR2(200) NULL,
        IS_NONCONCURRENT VARCHAR2(1) NULL,
        REQUESTS_RECOVERY VARCHAR2(1) NULL,
        CONSTRAINT QRTZ_FIRED_TRIGGER_PK PRIMARY KEY (SCHED_NAME,ENTRY_ID)
    );
    CREATE TABLE qrtz_scheduler_state 
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        INSTANCE_NAME VARCHAR2(200) NOT NULL,
        LAST_CHECKIN_TIME NUMBER(13) NOT NULL,
        CHECKIN_INTERVAL NUMBER(13) NOT NULL,
        CONSTRAINT QRTZ_SCHEDULER_STATE_PK PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
    );
    CREATE TABLE qrtz_locks
      (
        SCHED_NAME VARCHAR2(120) NOT NULL,
        LOCK_NAME  VARCHAR2(40) NOT NULL, 
        CONSTRAINT QRTZ_LOCKS_PK PRIMARY KEY (SCHED_NAME,LOCK_NAME)
    );
    
    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);

    其中各表的含义如下所示:

    表名描述
    QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息
    QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括 Cron 表达式和时区信息
    QRTZ_FIRED_TRIGGERS 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
    QRTZ_PAUSED_TRIGGER_GRPS 存储已暂停的 Trigger 组的信息
    QRTZ_SCHEDULER_STATE 存储少量的有关 Scheduler 的状态信息,和别的 Scheduler 实例(假如是用于一个集群中)
    QRTZ_LOCKS 存储程序的非观锁的信息(假如使用了悲观锁)
    QRTZ_JOB_DETAILS 存储每一个已配置的 Job 的详细信息
    QRTZ_JOB_LISTENERS 存储有关已配置的 JobListener 的信息
    QRTZ_SIMPLE_TRIGGERS 存储简单的 Trigger,包括重复次数,间隔,以及已触的次数
    QRTZ_BLOG_TRIGGERS Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
    QRTZ_TRIGGER_LISTENERS 存储已配置的 TriggerListener 的信息
    QRTZ_TRIGGERS 存储已配置的 Trigger 的信息

    2.我的一个quartz.properties属性文件配置实例:

    org.quartz.scheduler.instanceName = MyScheduler
    org.quartz.threadPool.threadCount = 3
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
    org.quartz.jobStore.tablePrefix = QRTZ_
    org.quartz.jobStore.dataSource = myDS
    
    org.quartz.dataSource.myDS.driver = oracle.jdbc.driver.OracleDriver
    org.quartz.dataSource.myDS.URL = jdbc:oracle:thin:@localhost:1521:xe 
    org.quartz.dataSource.myDS.user = wanan
    org.quartz.dataSource.myDS.password = wanan
    org.quartz.dataSource.myDS.maxConnections =10

    3.然后进行我们的增删改,以及启动,运行 操作

    添加一个调度任务

    //添加定时任务
        @Override
        public int addjobgroup(QuartzJob quartzjob,Class<T> entity) throws Exception {
            JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) entity)
                    .withIdentity(quartzjob.getJob_name(), quartzjob.getJob_group())
                    .withDescription(quartzjob.getDescription())
                    .build();
            //表达式调度构建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzjob.getCron_expression());
            CronTrigger cronTrigger = (CronTrigger) TriggerBuilder
                    .newTrigger()
                    .withIdentity(quartzjob.getTrigger_name())
                    .withSchedule(scheduleBuilder)
                    .startNow()
                    .build();
    
            //创建scheduler
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.scheduleJob(jobDetail, cronTrigger);
            scheduler.start();
            return 1;
        }

    删除一个调度任务

    //删除定时任务
        @Override
        public int deljobgroup(String trigger_name) {
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            TriggerKey triggerkey = new TriggerKey(trigger_name);
            try {
                Scheduler scheduler = schedulerFactory.getScheduler();
                scheduler.unscheduleJob(triggerkey);// 移除触发器    
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
            return 1;
        }

    暂停一个任务

    //暂停某任务
        @Override
        public int pauseTrigger(String triggerName) {
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            TriggerKey triggerkey = new TriggerKey(triggerName);
            try {
                Scheduler scheduler = schedulerFactory.getScheduler();
                scheduler.pauseTrigger(triggerkey); // 暂停任务
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
            return 1;
        }

    重新启动某任务

    //重新开始某任务
    	@Override
    	public int resumeTriggers(String triggerName) {
    		SchedulerFactory schedulerFactory = new StdSchedulerFactory();
    		TriggerKey triggerkey = new TriggerKey(triggerName);
    	try {
    			Scheduler scheduler = schedulerFactory.getScheduler();
    			scheduler.resumeTrigger(triggerkey); // 重新开始某任务
    		} catch (SchedulerException e) {
    			e.printStackTrace();
    		}
    		return 1;
    	}
    

      更新某任务比较简单,即先删除此任务,再重新添加。

  • 相关阅读:
    halcon算子翻译——dev_set_paint
    Halcon算子翻译——dev_set_lut
    JDK、JRE、JVM各自是什么、以及什么关系
    dict 增删改查
    str 操作方法
    python基础_格式化输出(%用法和format用法)
    python spilt()函数的使用方法
    iterable- 什么是可迭代对象
    list 增 删 改 查 及 公共方法
    python 基本数据类型
  • 原文地址:https://www.cnblogs.com/donghb/p/7885468.html
Copyright © 2020-2023  润新知