八. 为 JobStroreTX 创建数据源
当使用持久性 JobStore 时,Quartz 需要一个数据源。数据源扮演着产生数据库连接工厂的角色。在 Java  中,所有的数据源要实现 java.sql.Datasource 接口。Quartz 自身并不提供 Datasource 的所有功能;它只代表了那一职责。默认的,Quartz 能使用另一开源的框架,叫做 Commons DBCP,或者可以通过 JNDI 查找应用服务器中定义的 DataSource。
DBCP 是一个 Jakarta Commons 项目,网址是 http://jakarta.apache.org/commons/dbcp。这个框架的二进制版包含在 Quartz 的发行版中,你应该把它加到你的 Quartz  应用中来。你还需要加入 Commons Pool 库,它也包含中 Quartz 发行版中,是 DBCP 要用到的。
使用 JobStoreTX 时,你必须在 quartz.properties 文件中指定 Datasource 属性。这允许 Quartz 为你创建并管理 Datasource。表 6.4 列示了使用 JobStoreTX 时需要的 Datasource 配置属性。
表 6.4. 配置 Quartz Datasource 的可用属性

属性
必须

org.quartz.dataSource.NAME.driver

描述:JDBC 驱动类的全限名

org.quartz.dataSource.NAME.URL

描述:连接到你的数据库的 URL(主机,端口等)

org.quartz.dataSource.NAME.user

描述:用于连接你的数据库的用户名

org.quartz.dataSource.NAME.password

描述:用于连接你的数据库的密码

org.quartz.dataSource.NAME.maxConnections

描述:DataSource 在连接接中创建的最大连接数

org.quartz.dataSource.NAME.validationQuary

描述:一个可选的 SQL 查询字串,DataSource 用它来侦测并替换失败/断开的连接。例如,Oracle 用户可选用 select table_name from user_tables,这个查询应当永远不会失败,除非直的就是连接不上了。

表 6.4  中列出的每一个属性,你需要用你选择的名字替换掉属性的 NAME 部分。只要保证 Datasource 的所有属性的 NAME 部分相同就行了。这个名字用于唯一的标识 Datasource。假如你需要配置多个 Datasource (在使用 JobStoreCMT 时你将会这么做),每一个 Datasource 应该有一个唯一的 NAME 值。
代码 6.2 展示了一个为 JobStoreTX 配置 Datasource 的例子,它需要加到 quartz.properties 文件中
代码 6.2. 一个用于非 CMT 环境的 Quartz Datasource 的例子

  1. org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver
  2. org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://localhost:1433/quartz
  3. org.quartz.dataSource.myDS.user = admin
  4. org.quartz.dataSource.myDS.password = myPassword
  5. org.quartz.dataSource.myDS.maxConnections = 10

org.quartz.dataSource.myDS.driver = net.sourceforge.jtds.jdbc.Driver org.quartz.dataSource.myDS.URL = jdbc:jtds:sqlserver://localhost:1433/quartz org.quartz.dataSource.myDS.user = admin org.quartz.dataSource.myDS.password = myPassword org.quartz.dataSource.myDS.maxConnections = 10
像上面代码 6.2 那样加入了 Datasource 部分到 quartz.properties 文件后,你仍然需要使之对于已配置的 Quartz JobStoreTX 是可用的。你可以通过把下面的属性加到属性文件中来做到这一点:
org.quartz.jobStore.DataSource = <DS_NAME>
这个 <DS_NAME> 应该与指定给个 Datasource 配置的名字相匹配。对于代码 6.2 中的例子来使用 Datasource,你应当在 quartz.properties 文件中加入下面这行:
org.quartz.jobStore.dataSource = myDS
这个值然后会传递给 JobStoreSupport 并且对于你的 JobStoreTX 就可用了,这样连接就可以被获取并传递到 DriverDelegate 实例。
九. 应用 JobStoreTX 运行 Quartz

当你已完成前面的配置步骤时,你的程序就可以准备启动了。正如前面所有的例子那样,你仍然需要一个启动类来从工厂创建一个 Scheduler 实例,并调用它的 start() 方法。一个如代码 6.3 中的类就足够了。
代码 6.3. 简单的启动类,从命令行调用来启动 Scheduler

  1. public class SchedulerMain {
  2. static Log logger = LogFactory.getLog(SchedulerMain.class);
  3. public static void main(String[] args) {
  4. SchedulerMain app = new SchedulerMain();
  5. app.startScheduler();
  6. }
  7. public void startScheduler() {
  8. try {
  9. // Create an instance of the Scheduler
  10. Scheduler scheduler =
  11. StdSchedulerFactory.getDefaultScheduler();
  12. logger.info("Scheduler starting up...");
  13. scheduler.start();
  14. } catch (SchedulerException ex) {
  15. logger.error(ex);
  16. }
  17. }
  18. }

public class SchedulerMain { static Log logger = LogFactory.getLog(SchedulerMain.class); public static void main(String[] args) { SchedulerMain app = new SchedulerMain(); app.startScheduler(); } public void startScheduler() { try { // Create an instance of the Scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); logger.info("Scheduler starting up..."); scheduler.start(); } catch (SchedulerException ex) { logger.error(ex); } } }
当你使用代码 6.3 中的 SchedulerMain 类来测试 JobStoreTX 配置,你将得到类似于如下那样的输出:
INFO [main] - Quartz Scheduler v.1.5.0 created.
INFO [main] - Using thread monitor-based data access locking (synchronization).
INFO [main] - Removed 0 Volatile Trigger(s).
INFO [main] - Removed 0 Volatile Job(s).
INFO [main] - JobStoreTX initialized.
INFO [main] - Quartz scheduler 'QuartzScheduler' initialized from default resource
file in Quartz package: 'quartz.properties'
INFO [main] - Quartz scheduler version: 1.5.0
INFO [main] - Scheduler starting up...
INFO [main] - Freed 0 triggers from 'acquired' / 'blocked' state.
INFO [main] - Recovering 0 jobs that were in-progress at the time of the last
shut-down.

INFO [main] - Recovery complete.
INFO [main] - Removed 0 'complete' triggers.
INFO [main] - Removed 0 stale fired job entries.
INFO [main] - Scheduler QuartzScheduler_$_NON_CLUSTERED started.
日志信息是用 Log4J 显示的,因而它们可能和你实际的输出略有差别。一些事情从输出来看是很明显的。首先,在数据库中没有发现 Trigger 或 Job。这是很重要的,有些时候也是使人困惑之处。用了数据库却未给你加载任何的 Job 或 Trigger:是这样的,因为它无法知道谁来为你加载。这是你自己不得不做的事情,你可以几种方式把 Scheduler 信息存入到数据库中。

Job 存储和持久化 (第四部分)相关推荐

  1. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

    ​ 安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...

  2. graylog+kafka+zookeeper(单机测试及源码),graylog收集kafka(脚本创建发布订阅方式)存储的消息(四)

    graylog+kafka+zookeeper(单机测试及源码),graylog收集kafka(脚本创建发布订阅方式)存储的消息(四) 问题背景 graylog+kafka+zookeeper(单机测 ...

  3. Redis第一讲:相关的基础知识/数据类型/缓存的过期策略/双写一致性/内存存储和持久化

    Redis第一讲:相关的基础知识 摘要:本文是Redis(6.2.1)详解的第一讲,介绍Redis相关的基础知识,内存存储和持久化,Redis作缓存使用时的注意要点,常见的数据类型,缓存的过期策略,R ...

  4. mysql longtext可以存储多少文字_MySQL 四万字精华总结 + 面试100 问,和面试官扯皮绰绰有余(收藏系列)

    作者:派大新 链接:https://juejin.im/post/5f0d4fadf265da22f3250eaa 写在之前:不建议那种上来就是各种面试题罗列,然后背书式的去记忆,对技术的提升帮助很小 ...

  5. Android数据存储与持久化

    一.持久化技术简介 瞬时数据是指那些存储在内存当中,有可能会因为程序关闭或其他原因导致内存被回收而丢失的数据.这对于一些关键性的数据信息来说是绝对不能容忍的,谁都不希望自己刚发出去的一条微博,刷新一下 ...

  6. Job 存储和持久化 (第一部分)

    Quartz 用 JobStores 对 Job.Trigger.calendar 和 Schduler 数据提供一种存储机制.Scheduler 应用已配置的 JobStore 来存储和获取到部署信 ...

  7. KV数据存储:持久化

    介质特性 由于内存的易失性,存储于内存的数据需要持久化来保证数据的安全.除了存储介质不同,本质上数据是可以在不同的存储介质中互相拷贝.内存极好的随机访问特性.磁盘seek极慢,良好的顺序读写性能:SS ...

  8. 应用存储和持久化数据卷:存储快照与拓扑调度(至天)

    本文将主要分享以下两方面的内容: 存储快照概念.使用与工作原理: 存储拓扑调度背景.概念.使用与工作原理. 基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据 ...

  9. 应用存储和持久化数据卷:核心知识

    本次课程的分享主要围绕以下三个部分: K8s Volume 使用场景 PVC/PV/StorageClass 基本操作和概念解析 PVC+PV 体系的设计与实现原理 Volumes 介绍 Pod Vo ...

最新文章

  1. 学习sql注入:猜测数据库_对于SQL的热爱:为什么要学习它以及它将如何帮助您...
  2. 教育部发文35所高校新增AI本科专业!想回去重新高考
  3. java 空指针异常(java.lang.NullPointerException)
  4. java 基础--NIO(4)
  5. OS / linux 内核 read 操作源代码分析
  6. Python web开发——自定义userprofile(用户描述)
  7. 华为抓截屏_原来这才是华为截屏的正确姿势,今天才知道,千万别不当回事
  8. 重磅!普惠AI--华为云语音语义万次调用1元购,有奖问答@评论区等你来!
  9. 实现备份轮换方案的备份实用程序(C#中的开源Windows窗体应用程序)
  10. java分布式(java反汇编)
  11. android jni 多线程,[Android]JNI进阶--线程池
  12. 原生js的dom操作
  13. php最新猜骰子,最新微信猜骰子游戏源码(免公众号版+H5)
  14. node读写xlsx文件
  15. 运用flask框架发送短信验证码的流程及具体代码
  16. Linux随笔1 - Linux哲学思想与安装
  17. javaweb课程设计:基于websocket的网络聊天室(所有的资源和代码还有详细步骤我都会提供)
  18. 计算机应用基础商娟叶,探究混合式学习在中职计算机基础教学中的设计与应用...
  19. Windows XP 上网提示:您的时钟快了/慢了
  20. 手机射频测试-非信令

热门文章

  1. php生成静态翻页,PHP高手,我刚刚学PHP,在生成静态分页遇到了点有关问题,就是翻页的有关问题,希望可以給出一个漂亮完整的翻页代码,多谢...
  2. [专栏精选]UnityWebRequest详解
  3. double float区别 java,float和double有什么区别?
  4. OpenShift 4 - DevSecOps (1) - 安装 DevOps 环境
  5. 为制造业构建Teams Power App 2:创建客户UI
  6. C#中具有进程间通信的Singleton应用程序
  7. cocos2d-x 调用java_cocos2d-x中通过Jni实现Java与C++的互相调用
  8. 关于bootstrap和webinf下访问其它文件的方法 2021-04-17
  9. 清空本地_PyQt5播放实时视频流或本地视频文件
  10. sqoop建表_Sqoop基础教程