java quartz持久化_Quartz动态配置及持久化

本文详细介绍了如何在Java项目中使用Quartz进行任务调度,包括Quartz的配置、管理类的创建、数据库表的设置,以及如何在应用启动时启动和检查Quartz任务。通过示例展示了如何动态添加、暂停、恢复任务,并提供了Quartz持久化的相关配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于项目最近需要处理一些订单任务,本人去整理一下关于Quartz的资料。废话不多说,直接上干货!

首先在pox.xml文件加入下面quartz的jar:

org.quartz-scheduler

quartz

2.2.0

一、这个类关于quartz的管理类

import org.quartz.CronScheduleBuilder;

import org.quartz.JobBuilder;

import org.quartz.JobDetail;

import org.quartz.JobKey;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.Trigger;

import org.quartz.TriggerBuilder;

import org.quartz.impl.StdSchedulerFactory;

public class QuartzManage {

public static Scheduler scheduler = null;

static {

try {

scheduler = StdSchedulerFactory.getDefaultScheduler();

} catch (SchedulerException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}

public static Scheduler getScheduler() {

return scheduler;

}

/**

*

* @param className

*            job实现类名字

* @param jobName

*            job名字

* @param groupName

*            组名

* @param triggerName

*            触发器名字

* @param cron

*            表达式

*/

public static void add(Class className, String jobName, String groupName,

String triggerName, String cron) {

try {

Scheduler scheduler = QuartzManage.getScheduler();

CronScheduleBuilder builder = CronScheduleBuilder

.cronSchedule(cron);

JobDetail job = JobBuilder.newJob(className)

.withIdentity(jobName, groupName).build();

// 触发时间点

Trigger trigger = TriggerBuilder.newTrigger()

.withIdentity(triggerName, groupName).withSchedule(builder)

.build();

scheduler.scheduleJob(job, trigger);

if (!scheduler.isStarted()) {

scheduler.start();

}

} catch (SchedulerException e) {

e.printStackTrace();

}

}

/**

* 暂停任务

*/

public static void pause(JobKey jobKey) {

try {

Scheduler scheduler = QuartzManage.getScheduler();

scheduler.pauseJob(jobKey);

} catch (SchedulerException e) {

e.printStackTrace();

}

}

/**

* 恢复任务

*/

public static void recovery(JobKey jobkey) {

try {

Scheduler scheduler = QuartzManage.getScheduler();

scheduler.resumeJob(jobkey);

} catch (SchedulerException e) {

e.printStackTrace();

}

}

/**

* 恢复所有任务

*/

public static void recoveryAll() {

try {

Scheduler scheduler = QuartzManage.getScheduler();

scheduler.resumeAll();

} catch (SchedulerException e) {

e.printStackTrace();

}

}

/**

* 修改调度时间

*

* @param jobName

* @param time

*/

public static void modifyJobTime(String triggerName,

String triggerGroupName, String time) {

Scheduler scheduler = QuartzManage.getScheduler();

}

}

二、这个是quartz.properties

org.quartz.scheduler.instanceName = MyScheduler

org.quartz.threadPool.threadCount = 3

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.jobStore.dataSource = myDS

org.quartz.scheduler.jmx.export = true

org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver

org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/***?characterEncoding=utf-8

org.quartz.dataSource.myDS.user = root

org.quartz.dataSource.myDS.password = ***

org.quartz.dataSource.myDS.maxConnections = 5

org.quartz.jobStore.misfireThreshold = 5000

三、这是我自己写的关于job的抽象父类,doBusiness就是处理你所要做的事情的类

/**

*包自己导入即可

*/

/**

* job的父类

*

*/

public abstract class AbstractJobTask implements Job {

Logger logger = Logger.getLogger(this.getClass());

@Override

public void execute(JobExecutionContext context)

throws JobExecutionException {

this.jobExecutionContext = context;

// TODO Auto-generated method stub

try {

doBusiness();

} catch (Exception e) {

// 处理异常

doRecordLog(e);

}

}

/**

* 处理异常信息

*

* @param e

*/

void doRecordLog(Exception e) {

/**

*自己去实现,记录在数据库

*/

}

/**

* 处理业务

*

* @throws Exception

*/

protected abstract void doBusiness() throws Exception;

}

四、AbstractJobTask的子类

/**

*包自己导入即可

*/

public class WaitPayOrderJob extends AbstractJobTask {

@Override

protected void doBusiness() throws Exception {

/**

*自己去实现业务

*

*/

}

}

}

五、关于quartz的表,一定要在数据库里面执行

# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar

#

# PLEASE consider using mysql with innodb tables to avoid locking issues

#

# In your Quartz properties file, you'll need to set

# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

#

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;

DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;

DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;

DROP TABLE IF EXISTS QRTZ_LOCKS;

DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;

DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;

DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;

DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;

DROP TABLE IF EXISTS QRTZ_TRIGGERS;

DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;

DROP TABLE IF EXISTS QRTZ_CALENDARS;

CREATE TABLE QRTZ_JOB_DETAILS

(

SCHED_NAME VARCHAR(120) NOT NULL,

JOB_NAME  VARCHAR(200) NOT NULL,

JOB_GROUP VARCHAR(200) NOT NULL,

DESCRIPTION VARCHAR(250) NULL,

JOB_CLASS_NAME   VARCHAR(250) NOT NULL,

IS_DURABLE VARCHAR(1) NOT NULL,

IS_NONCONCURRENT VARCHAR(1) NOT NULL,

IS_UPDATE_DATA VARCHAR(1) NOT NULL,

REQUESTS_RECOVERY VARCHAR(1) NOT NULL,

JOB_DATA BLOB NULL,

PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)

);

CREATE TABLE QRTZ_TRIGGERS

(

SCHED_NAME VARCHAR(120) NOT NULL,

TRIGGER_NAME VARCHAR(200) NOT NULL,

TRIGGER_GROUP VARCHAR(200) NOT NULL,

JOB_NAME  VARCHAR(200) NOT NULL,

JOB_GROUP VARCHAR(200) NOT NULL,

DESCRIPTION VARCHAR(250) NULL,

NEXT_FIRE_TIME BIGINT(13) NULL,

PREV_FIRE_TIME BIGINT(13) NULL,

PRIORITY INTEGER NULL,

TRIGGER_STATE VARCHAR(16) NOT NULL,

TRIGGER_TYPE VARCHAR(8) NOT NULL,

START_TIME BIGINT(13) NOT NULL,

END_TIME BIGINT(13) NULL,

CALENDAR_NAME VARCHAR(200) NULL,

MISFIRE_INSTR SMALLINT(2) NULL,

JOB_DATA BLOB NULL,

PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),

FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)

REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)

);

CREATE TABLE QRTZ_SIMPLE_TRIGGERS

(

SCHED_NAME VARCHAR(120) NOT NULL,

TRIGGER_NAME VARCHAR(200) NOT NULL,

TRIGGER_GROUP VARCHAR(200) NOT NULL,

REPEAT_COUNT BIGINT(7) NOT NULL,

REPEAT_INTERVAL BIGINT(12) NOT NULL,

TIMES_TRIGGERED BIGINT(10) NOT NULL,

PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),

FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

);

CREATE TABLE QRTZ_CRON_TRIGGERS

(

SCHED_NAME VARCHAR(120) NOT NULL,

TRIGGER_NAME VARCHAR(200) NOT NULL,

TRIGGER_GROUP VARCHAR(200) NOT NULL,

CRON_EXPRESSION VARCHAR(200) NOT NULL,

TIME_ZONE_ID VARCHAR(80),

PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),

FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

);

CREATE TABLE QRTZ_SIMPROP_TRIGGERS

(

SCHED_NAME VARCHAR(120) NOT NULL,

TRIGGER_NAME VARCHAR(200) NOT NULL,

TRIGGER_GROUP VARCHAR(200) NOT NULL,

STR_PROP_1 VARCHAR(512) NULL,

STR_PROP_2 VARCHAR(512) NULL,

STR_PROP_3 VARCHAR(512) NULL,

INT_PROP_1 INT NULL,

INT_PROP_2 INT NULL,

LONG_PROP_1 BIGINT NULL,

LONG_PROP_2 BIGINT NULL,

DEC_PROP_1 NUMERIC(13,4) NULL,

DEC_PROP_2 NUMERIC(13,4) NULL,

BOOL_PROP_1 VARCHAR(1) NULL,

BOOL_PROP_2 VARCHAR(1) NULL,

PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),

FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

);

CREATE TABLE QRTZ_BLOB_TRIGGERS

(

SCHED_NAME VARCHAR(120) NOT NULL,

TRIGGER_NAME VARCHAR(200) NOT NULL,

TRIGGER_GROUP VARCHAR(200) NOT NULL,

BLOB_DATA BLOB NULL,

PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),

FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)

);

CREATE TABLE QRTZ_CALENDARS

(

SCHED_NAME VARCHAR(120) NOT NULL,

CALENDAR_NAME  VARCHAR(200) NOT NULL,

CALENDAR BLOB NOT NULL,

PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)

);

CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS

(

SCHED_NAME VARCHAR(120) NOT NULL,

TRIGGER_GROUP  VARCHAR(200) NOT NULL,

PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)

);

CREATE TABLE QRTZ_FIRED_TRIGGERS

(

SCHED_NAME VARCHAR(120) NOT NULL,

ENTRY_ID VARCHAR(95) NOT NULL,

TRIGGER_NAME VARCHAR(200) NOT NULL,

TRIGGER_GROUP VARCHAR(200) NOT NULL,

INSTANCE_NAME VARCHAR(200) NOT NULL,

FIRED_TIME BIGINT(13) NOT NULL,

SCHED_TIME BIGINT(13) NOT NULL,

PRIORITY INTEGER NOT NULL,

STATE VARCHAR(16) NOT NULL,

JOB_NAME VARCHAR(200) NULL,

JOB_GROUP VARCHAR(200) NULL,

IS_NONCONCURRENT VARCHAR(1) NULL,

REQUESTS_RECOVERY VARCHAR(1) NULL,

PRIMARY KEY (SCHED_NAME,ENTRY_ID)

);

CREATE TABLE QRTZ_SCHEDULER_STATE

(

SCHED_NAME VARCHAR(120) NOT NULL,

INSTANCE_NAME VARCHAR(200) NOT NULL,

LAST_CHECKIN_TIME BIGINT(13) NOT NULL,

CHECKIN_INTERVAL BIGINT(13) NOT NULL,

PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)

);

CREATE TABLE QRTZ_LOCKS

(

SCHED_NAME VARCHAR(120) NOT NULL,

LOCK_NAME  VARCHAR(40) NOT NULL,

PRIMARY KEY (SCHED_NAME,LOCK_NAME)

);

commit;

六、最重要一步,在项目启动时要启动quartz

public class ApplicationContextListener implements ServletContextListener {

private Logger logger = Logger.getLogger(this.getClass());

public static Scheduler scheduler = null;

@Override

public void contextInitialized(ServletContextEvent arg0) {

this.logger.info("The application start...");

/* 注册定时任务 */

try { // 获取Scheduler实例

scheduler = QuartzManage.getScheduler();

scheduler.start();

scheduler.resumeAll();//唤醒暂停的任务

checkJobExist();

} catch (SchedulerException se) {

logger.error(se.getMessage(), se);

}

}

private void checkJobExist() {

try {

// TODO Auto-generated method stub

if (!scheduler.checkExists(new JobKey("WaitPayOrderJob",

"SayJobGroup"))) {

QuartzManage.add(WaitPayOrderJob.class, "WaitPayOrderJob",

"SayJobGroup", "WaitPayOrderTrigger", "0/10 * * * * ?");

}

} catch (SchedulerException e) {

e.printStackTrace();

}

}

@Override

public void contextDestroyed(ServletContextEvent arg0) {

this.logger.info("The application stop...");

/* 注销定时任务 */

try {

// 关闭Scheduler

scheduler.shutdown();

this.logger.info("The scheduler shutdown...");

} catch (SchedulerException se) {

logger.error(se.getMessage(), se);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值