三. 持久化演示
三.一 编写任务 MyJobStoreTX
package com.yjl.jdbc; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * * @author 两个蝴蝶飞 * 简单的 JobStoreTx 存储时的任务 * */ public class MyJobStoreTX implements Job{ @Override public void execute(JobExecutionContext context) throws JobExecutionException { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String nowDate=sdf.format(new Date()); System.out.println("MyJobStoreTX 备份数据库的时间是:"+nowDate); } }
三.二 编写主程序 MyJobStoreTxDemo
//测试 JobStoreTX 存储 public class MyJobStoreTxDemo { public static void main(String[] args) throws Exception { // 获取Scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); JobDetail jobDetail = JobBuilder.newJob(MyJobStoreTX.class) .withIdentity("jobTX1", "groupTX1") .storeDurably(true) .build(); // 创建 Trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("triggerTX1", "groupTX1") // 设置标识 .startNow() // 每隔3秒执行一次 .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) .build(); // 关联 job和 trigger scheduler.scheduleJob(jobDetail, trigger); // 启动 scheduler scheduler.start(); } }
三.三 运行程序,看控制台打印输出
每隔两秒,运行一次。
查看数据库的 qrtz_cron_triggers 表内容:
查看数据库的 qrtz_job_details 表内容:
查看数据库的 qrtz_triggers 表内容:
将 JobDetail, Trigger 的内容放置到了数据库里面,进行了持久性的保存。
三.四 关闭程序后,再次运行
再次运行
Exception in thread “main” org.quartz.ObjectAlreadyExistsException:
Unable to store Job : ‘groupTX1.jobTX1’, because one already exists with this identification.
说已经存在了, 即 JobDetail的 组名称.job名称, 两个唯一确定一个JobDetail 任务对象。
与平常项目中的操作一样,在创建之前,先进行验证, 如果存在了,就执行以前的那个,如果不存在,就创建。
三.五 创建前验证是否存在的主程序 MyJobStoreTxDemo
//测试 JobStoreTX 存储 public class MyJobStoreTxDemo { public static void main(String[] args) throws Exception { // 获取Scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //定义JobKey JobKey jobKey=new JobKey("jobTX1", "groupTX1"); //判断是否存在,查询所有 的触发器 List<? extends Trigger> triggers1 = scheduler.getTriggersOfJob(jobKey); if(triggers1.size() > 0){ for (Trigger tg : triggers1) { // 根据类型判断 if ((tg instanceof CronTrigger) || (tg instanceof SimpleTrigger)) { // 恢复job运行 scheduler.resumeJob(jobKey); } } scheduler.start(); }else{ JobDetail jobDetail = JobBuilder.newJob(MyJobStoreTX.class) .withIdentity(jobKey) .storeDurably(true) .build(); // 创建 Trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("triggerTX1", "groupTX1") // 设置标识 .startNow() // 每隔3秒执行一次 .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) .build(); // 关联 job和 trigger scheduler.scheduleJob(jobDetail, trigger); // 启动 scheduler scheduler.start(); } } }
三.六 重新启动,查看控制台输出
正常启动作业任务。
四. Spring 配置 Quartz 持久化
与 Spring 配置 Quartz 差不多,仍然使用以前的例子。
注意,这个时候,将 quartz.properties 的数据源配置暂时移除, 数据源的配置交给 Spring 管理了。
# 注释掉内存存储 # org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore #持久化 org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX ##驱动代理为 标准的jdbc org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate #数据库表前缀 org.quartz.jobStore.tablePrefix:qrtz_ #数据源交给 spring 进行管理 #org.quartz.jobStore.dataSource:yjlDB #JDBC驱动 #org.quartz.dataSource.yjlDB.driver:com.mysql.jdbc.Driver #org.quartz.dataSource.yjlDB.URL:jdbc:mysql://localhost:3306/quartz #org.quartz.dataSource.yjlDB.user:root #org.quartz.dataSource.yjlDB.password:abc123
将 MyJob.java 的 输出语句改变一下,更好的区分。
System.out.println("spring管理持久化 备份数据库的时间是:"+dateString);
四.一 配置静态的任务
<!-- 定义 JobDetail, 所用的bean 为 JobDetailFactoryBean --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 任务名 --> <property name="name" value="job1"></property> <!-- 组名 --> <property name="group" value="group1"></property> <!-- 关联任务 --> <property name="jobClass" value="com.yjl.job.MyJob"></property> <!-- 必须是true, 如果是false的话,当这个jobDetail没有被Trigger关联时,会删除 --> <property name="durability" value="true"></property> <!-- 不设置 applicationContextJobDataKey 属性--> </bean> <!-- 定义 cron 触发器 --> <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 配置触发器的名称 --> <property name="name" value="trigger1"></property> <!-- 配置触发器的组名 --> <property name="group" value="group1"></property> <!-- 配置关联的 JobDetail --> <property name="jobDetail" ref="jobDetail"></property> <!-- 配置 cron 表达式 ,每2秒触发一次--> <property name="cronExpression" value="0/2 * * * * ?"></property> </bean> <!-- 配置 scheduler 调度器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="trigger1"/> </list> </property> <!-- 引入 quartz的配置信息 --> <!-- <property name="configLocation" value="classpath:quartz.properties"></property> --> <property name="quartzProperties"> <value> org.quartz.scheduler.instanceName: DefaultQuartzScheduler org.quartz.scheduler.rmi.export: false org.quartz.scheduler.rmi.proxy: false org.quartz.scheduler.wrapJobExecutionInUserTransaction: false 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.jobStore.class: org.quartz.simpl.RAMJobStore --> org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX <!--驱动--> org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate <!-- 数据库表前缀 --> org.quartz.jobStore.tablePrefix:qrtz_ </value> </property> <!-- 配置数据源 --> <property name="dataSource" ref="dataSource"></property> </bean>
每2s 触发一次。
四.二 重启服务器,运行
正常的启动。
查看数据库, qrtz_cron_triggers 内容
其他两个表也同样有数据。
持久化成功。
四.三 移除 JobDetail 和 Trigger的配置
因为将 JobDetail 和 Trigger的信息,已经持久化到数据库里面了, 那么就可以将它的配置进行移除了(通常是不移除的,
这儿只是演示一下持久化)。
只保留 Scheduler 的配置
<!-- 配置 scheduler 调度器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!-- 没有触发器了,所以将触发器 triggers 属性也删除 --> <!-- 引入 quartz的配置信息 --> <!-- <property name="configLocation" value="classpath:quartz.properties"></property> --> <property name="quartzProperties"> <value> org.quartz.scheduler.instanceName: DefaultQuartzScheduler org.quartz.scheduler.rmi.export: false org.quartz.scheduler.rmi.proxy: false org.quartz.scheduler.wrapJobExecutionInUserTransaction: false 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.jobStore.class: org.quartz.simpl.RAMJobStore --> org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX <!--驱动--> org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate <!-- 数据库表前缀 --> org.quartz.jobStore.tablePrefix:qrtz_ </value> </property> <!-- 配置数据源 --> <property name="dataSource" ref="dataSource"></property> </bean>
这个时候,重启服务器,
仍然可以正常的运行。
通过数据库持久化,可以做定时任务管理系统。








