Quartz的持久化

发表时间:2017-07-11 17:10:38 浏览量( 29 ) 留言数( 0 )

学习目标:

1、了解Quartz的持久化

2、掌握Quartz持久化配置步骤


学习过程:

原来的定时任务都是保存在内存中的,如果web重启后建立的定时任务就会没有了,所以最好把定时任务持久化到数据库中,这样启动还是有的。

RAMJobStore

RAMJobStore 是使用最简单的也是最高效(依据CPU时间)的JobStore 。RAMJobStore 正如它名字描述的一样,它保存数据在RAM。

这就是为什么它是配置最简单的也是最高效的原因。缺点是你的应用结束之后所有的数据也丢失了--这意味着RAMJobStore 不具有保持job和trigger持久的能力。对于一些程序是可以接受的,甚至是期望的,但对于其他的程序可能是灾难性的。

要使用RAMJobStore你只需要在你的Quartz配置文件中添上这么一段话:

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

没有其他配置了。

JDBCJobStore

JDBCJobStore,正如名字描述的一样,它以JDBC的方式保存数据在数据库中。它比RAMJobStore的配置复杂一点,也没有RAMJobStore快。然而,性能缺点不是糟透了,特别是如果你在数据库表主键上建立了索引。在机器之间的LAN(在scheduler 和数据库之间)合理的情况下,检索和更新一个被触发的Trigger花费的时间少于10毫秒。

JDBCJobStore 几乎适用于所有的数据库,广泛用于 Oracle,

 PostgreSQL, MySQL, MS SQLServer, HSQLDB, 和DB2

一、先建立表

下载 Quartz 2.2.3 .tar.gz 

在建表模版在Quartz包下docs/dbTables下,选择相应的数据库和版本即可


数据库表得简单说明:


1.1.qrtz_blob_triggers : 以Blob 类型存储的触发器。 

1.2.qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范围。 

1.3.qrtz_cron_triggers:存放cron类型的触发器。 

1.4.qrtz_fired_triggers:存放已触发的触发器。 

1.5.qrtz_job_details:存放一个jobDetail信息。 

1.6.qrtz_job_listeners:job**监听器**。 

1.7.qrtz_locks: 存储程序的悲观锁的信息(假如使用了悲观锁)。 

1.8.qrtz_paused_trigger_graps:存放暂停掉的触发器。 

1.9.qrtz_scheduler_state:调度器状态。 

1.10.qrtz_simple_triggers:简单触发器的信息。 

1.11.qrtz_trigger_listeners:触发器监听器。 

1.12.qrtz_triggers:触发器的基本信息。


二、配置文件

#Configure JDBC-JobStoreTX  
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

#数据源的名字  
org.quartz.jobStore.dataSource=myDS 
#配置表的前缀  
org.quartz.jobStore.tablePrefix=QRTZ_  
  
#Configure DataSources  
org.quartz.dataSource.myDS.driver=com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL=jdbc:mysql://localhost:3306/quartzdb_dev?useUnicode=true&characterEncoding=UTF8
org.quartz.dataSource.myDS.user=root 
org.quartz.dataSource.myDS.password=123456


三、测试

项目不需要修改什么东西,记得添加数据库得驱动类就可以了。

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.35</version>
		</dependency>

我们运行第一个实例得代码


然后查看数据库。


然后我们把项目停了。把建立任务得代码删了,只保留启动得。看一下控制台是否还是有输出了呢。证明任务是从数据库中读取得。

public static void main(String[] args) {

		try {
			SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();

			Scheduler sched = schedFact.getScheduler();

			sched.start();

			// define the job and tie it to our HelloJob class
			//JobDetail job = newJob(HelloJob.class).withIdentity("myJob", "group1").build();

			// Trigger the job to run now, and then every 40 seconds
			//Trigger trigger = newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(simpleSchedule().withIntervalInSeconds(40).repeatForever()).build();

			// Tell quartz to schedule the job using our trigger
			//sched.scheduleJob(job, trigger);
		} catch (SchedulerException se) {
			se.printStackTrace();
		}
	}