定时任务调度框架Quartz--Job Stores

RAMJobStore

        RAMJobStore是使用最简单的JobStore,它也是性能最高的,因为它直接把Job执行过程中产生的数据存放到内存中。从源码上来看,发现了RAMJobStore中大量使用了HashMap类,所以在服务器宕机重启后,所有数据都丢失了。
        RAMJobStore基于内存,适合可以丢失数据的定时任务业务场景,优点在于它速度飞快。

        在配置文件quartz.properties文件中这样配置

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

JDBCJobStore

        JDBCJobStore几乎与任何数据库一起使用,已被广泛应用于Oracle,PostgreSQL,MySQL,MS SQLServer,HSQLDB和DB2。Quartz提供了11张表,用于把JOB的数据存放在数据库中,能够在服务器宕机后恢复Job数据。
        对于多个调度程序实例,使用不同的前缀可能有助于创建多组表。

        一般Mysql与Oracle使用标准的数据库方言。可以这样配置

org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate

        使用JDBCJobStore需要考虑使用什么事务。

         不需要将调度命令(例如添加和删除triggers)绑定到其他事务,那么可以通过使用JobStoreTX作为JobStore 来管理事务(这是最常见的选择)

org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX

        一般如果定时任务项目集成在Spring项目中,推荐使用JobStoreCMT - 在这种情况下,Quartz将让应用程序服务器容器来管理事务

org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT

JDBCJobStore的datasource

        JDBCJobStore可以自定义数据库连接,就像下面配置一样。也可以使用Spring容器集成得数据库连接

org.quartz.jobStore.dataSource=myDS
#============================================================================
# Configure Datasources  
#============================================================================
org.quartz.dataSource.myDS.driver:com.mysql.cj.jdbc.Driver
org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/demo_quartz
org.quartz.dataSource.myDS.user:root
org.quartz.dataSource.myDS.password:3333
org.quartz.dataSource.myDS.maxConnections:5
org.quartz.dataSource.myDS.validationQuery:select 0

配置JDBCJobStore的表前缀

        默认的表前缀就是ORTZ_,可以换成T_QRTZ_,但是要同步把建表SQL中的ORTZ_的语句改为T_QRTZ
        在这里插入图片描述
        配置就像下面一样就可以了。

org.quartz.jobStore.tablePrefix=QRTZ_

JdbcStore实际执行效果

public static void main(String[] args) {
        try {
            //define the job and bind it to our HelloJob class
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();

            JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").
                    build();

            Trigger trigger2 = newTrigger().withIdentity("trigger2", "group1")
                    .usingJobData("格言3", "奥特曼猪猪侠闪电小子葫芦娃")
                    .startAt(DateBuilder.todayAt(10, 0, 0))
                    .withSchedule(cronSchedule("0 0/1 15 * * ?").
                            //错过的任务全部忽略
                                    withMisfireHandlingInstructionDoNothing())
                    .forJob("job1", "group1").build();

            scheduler.deleteJob(trigger2.getJobKey());
            //用我们的触发告诉schedule安排工作
            scheduler.scheduleJob(job, trigger2);

            //在调用shutdown()之前,你需要给job的触发和执行预留一些时间,比如,你可以调用
            Thread.sleep(1000000000);
            scheduler.shutdown();
        } catch (Exception e) {
            LOGGER.error("an exception was occurred , caused by :{}", e.getMessage());
        }
    }

    public static class HelloJob implements Job {

        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            LOGGER.error("现在是:{},JobInstanceId:{}", 
                    DateTransformTools.dateToDateStr(new Date()), this.hashCode());
        }
    }

        配置文件quartz.properties

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================
org.quartz.scheduler.instanceName:wisedu@InstanceName
org.quartz.scheduler.instanceId:AUTO
#============================================================================
# Configure ThreadPool  
#============================================================================
org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount:3
#============================================================================
# Configure JobStore  
#============================================================================
org.quartz.jobStore.misfireThreshold:60000
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=true
org.quartz.jobStore.dataSource=myDS
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=false
#============================================================================
# Configure Datasources  
#============================================================================
org.quartz.dataSource.myDS.driver:com.mysql.cj.jdbc.Driver
org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/demo_quartz
org.quartz.dataSource.myDS.user:root
org.quartz.dataSource.myDS.password:3333
org.quartz.dataSource.myDS.maxConnections:5
org.quartz.dataSource.myDS.validationQuery:select 0

程序启动后Job相关数据存放到数据库中,说明集成Quartz使用JdbcStore成功。
公司的生产库上使用了集群,下次再研究吧。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

posted @ 2022-07-17 12:13  小大宇  阅读(108)  评论(0编辑  收藏  举报