基于数据库的作业调度

在进行基于JDBC作业调度前,须在数据库中建立quartz依赖的表,使用quartz.sql在数据库中进行表格的创建.

基于数据库的调度方式:作业逻辑和触发器在运行时会 自动保存在数据库中,在程序终止时可以确保不会丢失相关逻辑实现,在系统重新启动时重新加载进内存继续作业;quartz.properties配置文件放在src目录下会被自动读取
步骤1 : 编写作业调度配置文件,其中涉及到数据库连接配置(在src目录下新建quartz.properties配置文件)
quartz.properties
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName: quartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 2
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
#============================================================================
# Configure JobStore
#============================================================================
#default config
#org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
#\u6301\u4e45\u5316\u914d\u7f6e
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties:true
#============================================================================
#havent cluster spring
#============================================================================
org.quartz.jobStore.isClustered = false
#\u6570\u636e\u5e93\u8868\u524d\u7f00
org.quartz.jobStore.tablePrefix:qrtz_
org.quartz.jobStore.dataSource:qzDS
#============================================================================
# Configure Datasources
#============================================================================
#\u6570\u636E\u6E90\u547D\u540D
org.quartz.jobStore.dataSource= qzDS
org.quartz.dataSource.qzDS.driver= com.mysql.jdbc.Driver
org.quartz.dataSource.qzDS.URL= jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8
org.quartz.dataSource.qzDS.user= root
org.quartz.dataSource.qzDS.password= 123456
org.quartz.dataSource.qzDS.maxConnections= 10

步骤2 : 新建作业逻辑类
ROMJob.java
package cn.dragonajack.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ROMJob implements Job{
private static Logger logger=LoggerFactory.getLogger(QuartzRAM.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
logger.info("ROM111111111111111111");
logger.info("ROM222222222222222222");
logger.info("ROM333333333333333333");
}
}
步骤3 : 实现作业逻辑调度
QuartzTest .java
package cn.dragonajack.quartz;

import java.util.Date;
import java.util.List;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class QuartzTest {
private static Logger logger=LoggerFactory.getLogger(QuartzRAM.class);
public static void main(String[] args) {
startQuartz();
//resumeJob();
}
/**
* 开启作业调度
*/
public static void startQuartz(){
//调度工厂
SchedulerFactory factory=new StdSchedulerFactory();
try {
//得到调度器
Scheduler scheduler=factory.getScheduler();
//作业
JobDetail jobDetail=JobBuilder.newJob(ROMJob.class).withDescription("在DB中的作业,程序关闭作业被保存到数据库中")
.withIdentity("ROMJob_1","ROMJob_Group_1").build();
long startTime=System.currentTimeMillis()+3*1000;
//触发器
/* Trigger trigger=TriggerBuilder.newTrigger().withDescription("RAMJob_1的触发器,每两秒执行一次")
.withIdentity("ROMTrigger_1","ROMTrigger_Group_1").startAt(new Date(startTime))
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();*/
Trigger trigger=TriggerBuilder.newTrigger().withDescription("RAMJob_1的触发器,每两秒执行一次")
.withIdentity("ROMTrigger_1","ROMTrigger_Group_1").startAt(new Date(startTime))
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)).build();
/**
* 上面两种触发器均可使用,区别只是代码的编写,实现的功能都是一样,在数据库中保存的话,上述两种触发器均有各自的表进行存储
*/
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
logger.info("启动时间");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 恢复保存在数据库中的作业调度
*/
private static void resumeJob(){
//调度工厂
SchedulerFactory factory=new StdSchedulerFactory();
try {
//得到调度器
Scheduler scheduler=factory.getScheduler();
JobKey jobKey=new JobKey("ROMJob_1","ROMJob_Group_1");
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
if(triggers.size()>0){
for (Trigger trigger : triggers) {
if((trigger instanceof CronTrigger)||(trigger instanceof SimpleTrigger)){
scheduler.resumeJob(jobKey);//恢复保存在数据库中的作业调度
//scheduler.deleteJob(jobKey);//删除保存在数据中的作业调度
}
}
scheduler.start();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}

作业调度和触发器相关的内容保存到数据库中,程序终止后重新启动后会从数据库中加载进内存,继续进行调度作业


猜你喜欢

转载自blog.csdn.net/leocolee/article/details/80398436