Quartz的持久化数据库(九)中

简介: Quartz的持久化数据库(九)中

三. 持久化演示

三.一 编写任务 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();
  }
}


三.三 运行程序,看控制台打印输出

image.png


每隔两秒,运行一次。


查看数据库的 qrtz_cron_triggers 表内容:

image.png



查看数据库的 qrtz_job_details 表内容:


image.png


查看数据库的 qrtz_triggers 表内容:


image.png


将 JobDetail, Trigger 的内容放置到了数据库里面,进行了持久性的保存。


三.四 关闭程序后,再次运行

再次运行


image.png


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();
       }
  }
}


三.六 重新启动,查看控制台输出

image.png


正常启动作业任务。


四. 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 触发一次。

四.二 重启服务器,运行

image.png


正常的启动。


查看数据库, qrtz_cron_triggers 内容


image.png


其他两个表也同样有数据。


持久化成功。


四.三 移除 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>


这个时候,重启服务器,


image.png


仍然可以正常的运行。


通过数据库持久化,可以做定时任务管理系统。

相关文章
|
SQL 开发框架 JavaScript
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
在 Vue 中进行数据持久化时,有哪些常用的数据库框架?
292 3
|
NoSQL 安全 Unix
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(中)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
193 0
|
存储 缓存 API
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
329 6
|
存储 NoSQL API
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(上)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
156 1
|
JavaScript 前端开发 API
如何在 Vue 中进行数据持久化(例如与后端数据库交互)?
如何在 Vue 中进行数据持久化(例如与后端数据库交互)?
432 3
|
存储 NoSQL 调度
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(下)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
168 0
|
SQL Java 数据库连接
使用Hibernate进行数据库持久化操作
【4月更文挑战第15天】Hibernate 是一款开源 ORM 框架,简化数据库操作,通过映射将 Java 对象与表交互。核心接口包括 SessionFactory、Session、Transaction、Query 和 Criteria。使用 Hibernate 需添加依赖,配置 hibernate.cfg.xml 文件,设置数据库信息,并创建实体类及映射文件。
271 0
|
7月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
510 158
|
7月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1277 152

热门文章

最新文章