zoukankan      html  css  js  c++  java
  • spring 4.0+quartz2.2 实现持久化

     最近在搭建框架 用到quartz持久化这块 查了一些文档  如下配置即可。

     这里是quartz官方提供配置步骤 http://www.quartz-scheduler.org/

     
     Quartz包含三个抽象概念,调度器,任务,触发器
    @1:Job:接口,实现接口方法定义任务
    @2:JobDetail:关联Job实现类和Schedular的类,其构造函数,指定Job实现类,任务在Schedular中的组名和Job名称
    @3:Trigger:触发器类,描述触发事件,包含简单的时间规则和复杂的时间规则,SimpleTrigger和CronTrigger
    @4:Schedular:Quartz容器,包含Trigger和JobDetail,

           说下跟spring整合并实现持久化

            首先在pom中引用quartz官方提供jar

          

    <dependency>
          <groupId>org.quartz-scheduler</groupId>
          <artifactId>quartz</artifactId>
          <version>2.2.1</version>
      </dependency>
      <dependency>
          <groupId>org.quartz-scheduler</groupId>
          <artifactId>quartz-jobs</artifactId>
          <version>2.2.1</version>
      </dependency>
    之后再配置quartz的工厂 交给spring管理 即可
    <bean id="schedulerFactoryBean"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="dataSource" ref="dataSource" /><!-- 数据源 -->
    <property name="configLocation" value="classpath:quartz-db.properties" /><!-- ../bin/quartz-db.properties classpath*:quartz-db.properties -->
    <property name="startupDelay" value="0" /><!-- 启动xx秒后开始调度 -->
    <property name="autoStartup" value="true"/> 
    <property name="schedulerListeners">
    <list>
    <bean class="com.deppon.quartz.listener.MySchedulerListener"></bean>  <!--这里只是继承的监听 做了一些日志打印 可以不要-->
    </list>
    </property>
    </bean>
    
    




    接下来是一些quartz的配置  参考博客

    http://orange5458.iteye.com/blog/1170777

    #配置文件

    org.quartz.scheduler.instanceName = DefaultQuartzScheduler
    org.quartz.scheduler.rmi.export = false
    org.quartz.scheduler.rmi.proxy = false
    org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
    org.quartz.scheduler.jmx.export = true
    #类名(SimpleThreadPool就好)
    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount = 10
    org.quartz.threadPool.threadPriority = 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
    #最大能忍受的触发超时时间
    org.quartz.jobStore.misfireThreshold = 60000
    #跳过更新检查
    org.quartz.scheduler.skipUpdateCheck = true
    #保存在内存中
    #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
    #application自己管理事务
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
    #org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
    #类似于Hibernate的dialect,用于处理DB之间的差异,StdJDBCDelegate能满足大部分的DB
    org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    #jobdataMap转换出错
    #JobDataMaps是否都为String类型
    #避免 rg.quartz.JobPersistenceException: Couldn't acquire next trigger: Couldn't retrieve trigger: null
    #org.quartz.jobStore.useProperties = true
    #表前缀
    org.quartz.jobStore.tablePrefix = QRTZ_
    #自动生成实例id
    org.quartz.scheduler.instanceId = AUTO
    #是否是应用在集群中,当应用在集群中时必须设置为TRUE,否则会出错
    org.quartz.jobStore.isClustered = true
    #scheduler的checkin时间,时间长短影响failure scheduler的发现速度
    org.quartz.jobStore.maxMisfiresToHandleAtATime=1
    #scheduler的checkin时间,时间长短影响failure scheduler的发现速度
    org.quartz.jobStore.clusterCheckinInterval = 20000
    #触发job时是否需要拥有锁
    #org.quartz.jobStore.acquireTriggersWithinLock
    #用于管理数据库中相关信息的锁机制的类名
    #org.quartz.jobStore.lockHandler.class

     

    更多的配置文件含义可以查看官方文档。

    quatrz有两张存储方式 一种保存在内存 另一种持久化

    持久化需要的表在quartz的官方文档有描述  。 下面是表

    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 的信息 
    View Code
    #
    # Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar
    #
    # PLEASE consider using mysql with innodb tables to avoid locking issues
    #
    # In your Quartz properties file, you'll need to set 
    # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    #
    
    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(200) NOT NULL,
    JOB_GROUP VARCHAR(200) 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)
    );
    
    CREATE TABLE QRTZ_TRIGGERS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    JOB_NAME VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) 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(200) 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)
    );
    
    CREATE TABLE QRTZ_SIMPLE_TRIGGERS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) 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)
    );
    
    CREATE TABLE QRTZ_CRON_TRIGGERS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    CRON_EXPRESSION VARCHAR(200) 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)
    );
    
    CREATE TABLE QRTZ_SIMPROP_TRIGGERS
    ( 
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) 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)
    );
    
    CREATE TABLE QRTZ_BLOB_TRIGGERS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    BLOB_DATA BLOB 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)
    );
    
    CREATE TABLE QRTZ_CALENDARS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    CALENDAR_NAME VARCHAR(200) NOT NULL,
    CALENDAR BLOB NOT NULL,
    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
    );
    
    CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL, 
    PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
    );
    
    CREATE TABLE QRTZ_FIRED_TRIGGERS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    ENTRY_ID VARCHAR(95) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    INSTANCE_NAME VARCHAR(200) 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(200) NULL,
    JOB_GROUP VARCHAR(200) NULL,
    IS_NONCONCURRENT VARCHAR(1) NULL,
    REQUESTS_RECOVERY VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,ENTRY_ID)
    );
    
    CREATE TABLE QRTZ_SCHEDULER_STATE
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
    CHECKIN_INTERVAL BIGINT(13) NOT NULL,
    PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
    );
    
    CREATE TABLE QRTZ_LOCKS
    (
    SCHED_NAME VARCHAR(120) NOT NULL,
    LOCK_NAME VARCHAR(40) NOT NULL, 
    PRIMARY KEY (SCHED_NAME,LOCK_NAME)
    );
    
    
    commit;
    
    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 的信息
    View Code
    
    
    
     

    现在你就可以在你的项目中使用quartz 

    //添加一个定时到你的表中   quartz持久化方法只需要调用api即可 
    
    @Resource
    private Scheduler scheduler;
    
    @Override
    public boolean scheduleJob(String jobGroup, String jobName, String jobClassName, Map<String, Object> dataMap, String cronExpression,String description) {
    String info = "添加任务";
    boolean result = false;
    
    try {
    // 查找任务最终执行对象
    Class jobClass= Class.forName(jobClassName);
    // this.getClass().getClassLoader().loadClass(name)
    JobDetail jobDetail = JobBuilder.newJob(jobClass)
    .withIdentity(jobName, jobGroup)
    .withDescription(description)
    .storeDurably()//是否持久化 1持久化
    .build();
    // 遍历参数,压入JobDateMap
    for (String key : dataMap.keySet()) {
    jobDetail.getJobDataMap().put(key, dataMap.get(key));
    }
    // 表达式调度构建器
    CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
    // 按新的cronExpression表达式构建一个新的trigger
    Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobDetail.getKey().getName(), jobDetail.getKey().getGroup()).withSchedule(cronScheduleBuilder).build();
    
    scheduler.scheduleJob(jobDetail, trigger);
    result = true;
    } catch (Exception e) {
    logger.error(className + ".scheduleJob(" + info + ") 发生异常", e);
    }
    
    return result;
    }

    //构建自己的job 

    
    

    public class CopyOfmyJob implements Job {

    
    

    @Override
    public void execute(JobExecutionContext context)
    throws JobExecutionException {
    System.out.println("我是测试");
    }

     

    数据库如图

    更多的方法可以参考Scheduler 这个类的源码 对于加载定时 停止定时等 都有描述。

     --后续上述实现的是无状态的job 如果需要有状态的job 在2.0以后的jar包里提供了了注解

    @PersistJobDataAfterExecution

    如果不支持并发

    @disallowconcurrentexecution

    --致自己 当你接触一个新东西的时候,学习最快的方式就是查看官方文档。

  • 相关阅读:
    JVM -- Full GC触发条件总结以及解决策略
    java实现-图的相关操作
    Integer的intValue()方法
    Java transient关键字
    Redis 单线程模型介绍
    String类的intern()方法 -- 重用String对象,节省内存消耗
    数据库阿里连接池 druid配置详解
    redis 实现发布/订阅模式
    Redis实现队列
    redis 实现分布式锁
  • 原文地址:https://www.cnblogs.com/zyzcj/p/6414824.html
Copyright © 2011-2022 走看看