一、表设计:
DROP TABLE IF EXISTS `ma_quartz_info`;
CREATE TABLE `ma_quartz_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(32) DEFAULT '' COMMENT '定时任务名称',
`code` varchar(64) DEFAULT '' COMMENT '定时任务code标识',
`cycle` varchar(32) DEFAULT '' COMMENT '定时任务执行周期',
`class_name` varchar(64) DEFAULT '' COMMENT '定时任务执行类',
`succeed` int(11) DEFAULT '0' COMMENT '成功执行次数',
`fail` int(11) DEFAULT '0' COMMENT '失败执行次数',
`state` varchar(2) DEFAULT '' COMMENT '是否启用 10启用 20禁用',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`init_data_url` varchar(100) DEFAULT NULL COMMENT '初始化数据url',
PRIMARY KEY (`id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务信息表';
INSERT INTO ma_quartz_info(name, code, cycle, class_name, state, init_data_url) VALUES ('用户行为','applicantsBehavior','0 57 2 * * ?','com.jxl.manado.job.ApplicantsBehaviorJob','10','/manado/userAnalysis/deleteUserBehavior.api');
DROP TABLE IF EXISTS `ma_quartz_log`;
CREATE TABLE `ma_quartz_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`quartz_id` bigint(20) DEFAULT NULL COMMENT '定时任务id',
`start_time` datetime DEFAULT NULL COMMENT '启动时间',
`time` int(11) DEFAULT '0' COMMENT '任务用时',
`result` varchar(2) DEFAULT '' COMMENT '执行结果 10成功 20失败',
`remark` varchar(128) DEFAULT '' COMMENT '备注信息',
PRIMARY KEY (`id`),
KEY `quartz_id` (`quartz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时任务执行记录表';
(quartzInfoService 和 quartzInfoDao 略)
二、QuartzManager
@Service
public class QuartzManager {
// private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
public static final Logger logger = LoggerFactory
.getLogger(QuartzManager.class);
@Autowired
private Scheduler scheduler;
/**
* 添加一个定时任务
*
* @param jobName
* @param time
*/
public void addJob(String jobName,String jobClassName, String time) {
try {
Class jobClass = Class.forName(jobClassName);
// Scheduler scheduler = gSchedulerFactory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, JOB_GROUP_NAME).build();// 任务名,任务组,任务执行类
// 触发器
//表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, TRIGGER_GROUP_NAME).withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
// 启动
if (!scheduler.isShutdown()) {
scheduler.start();
}
} catch (SchedulerException e) {
logger.error(e.getMessage(), e);
} catch (ClassNotFoundException e) {
logger.error(e.getMessage(), e);
}
}
/**
* 修改一个任务的触发时间
*
* @param Jobname
* @param time
* @param time
*/
public void modifyJobTime(String Jobname,String time) {
try {
// Scheduler scheduler = gSchedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(Jobname, TRIGGER_GROUP_NAME);
//获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) { //表达式调度构建器
// 修改时间
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(time);
//按新的cronExpression表达式构建一个新的trigger
trigger = TriggerBuilder.newTrigger().withIdentity(Jobname, TRIGGER_GROUP_NAME).withSchedule(scheduleBuilder).build();
// 重启触发器
scheduler.rescheduleJob(triggerKey, trigger);
}
} catch (SchedulerException e) {
logger.error(e.getMessage(), e);
}
}
/**
* 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
*/
public void removeJob(String jobName) {
try {
// Scheduler scheduler = gSchedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
scheduler.pauseTrigger(triggerKey);// 停止触发器
scheduler.unscheduleJob(triggerKey);// 移除触发器
scheduler.deleteJob(JobKey.jobKey(jobName, JOB_GROUP_NAME));// 删除任务
} catch (SchedulerException e) {
logger.error(e.getMessage(), e);
}
}
/**
* 立即执行任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
*/
public void startJobNow(String jobName) {
try {
// Scheduler scheduler = gSchedulerFactory.getScheduler();
scheduler.triggerJob(JobKey.jobKey(jobName, JOB_GROUP_NAME));
} catch (SchedulerException e) {
logger.error(e.getMessage(), e);
}
}
/**
* 启动所有定时任务
*/
public void startJobs() {
try {
// Scheduler scheduler = gSchedulerFactory.getScheduler();
scheduler.start();
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
}
}
/**
* 关闭所有定时任务
*/
public void shutdownJobs() {
try {
// Scheduler scheduler = gSchedulerFactory.getScheduler();
if (!scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (SchedulerException e) {
logger.error(e.getMessage(),e);
}
}
}
三、QuartzJobListener
public class QuartzJobListener extends QuartzInitializerListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
super.contextInitialized(servletContextEvent);
QuartzManager quartzManager = WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext()).getBean(QuartzManager.class);
QuartzInfoService quartzInfoService = WebApplicationContextUtils.getWebApplicationContext(servletContextEvent.getServletContext()).getBean(QuartzInfoService.class);
List<QuartzInfo> quartzInfoList = quartzInfoService.findAllUsedQuartzJobs();
if(Detect.notEmpty(quartzInfoList)){
for(QuartzInfo quartzInfo : quartzInfoList){
quartzManager.addJob(quartzInfo.getCode(), quartzInfo.getClassName(), quartzInfo.getCycle());
}
}
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
super.contextDestroyed(servletContextEvent);
}
}
相关推荐
这就是“Quartz数据库动态配置”所解决的问题。 Quartz通过将作业(Jobs)和触发器(Triggers)的信息存储在数据库中,实现了配置的动态化。这样,我们可以在不重启应用的情况下,通过修改数据库中的表来添加、删除...
通过这种方式,我们可以构建一个高度可扩展和可配置的定时任务系统,只需在数据库中修改Job和Trigger的配置,无需重启应用,就能动态调整任务的执行策略。这种方式特别适合大型分布式系统,可以实现任务的集中管理和...
标题中的“quartz数据库脚本”指的是Quartz为了适配多种数据库管理系统(DBMS)而提供的SQL脚本。这些脚本包含了创建和初始化Quartz所需表的命令,确保作业、触发器、作业细节等信息能够被正确存储和检索。 描述中...
本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...
这一步是Quartz配置中的关键部分,确保Quartz能够正确地存储和检索作业和触发器信息,从而实现预定的调度功能。 为了保证Quartz与数据库的兼容性,这些SQL语句通常会按照特定的数据库方言编写,因此在使用前需要...
了解了Quartz的数据库表结构和配置后,你可以根据具体需求调整和优化这些脚本,以适应你的应用环境。同时,记得在生产环境中对这些表进行适当的备份和维护,确保Quartz的稳定运行。在使用Quartz过程中,务必熟悉其...
2. **数据库配置**:由于我们选择了基于数据库的作业存储(job-store-type: jdbc),所以需要配置数据库连接信息,包括数据源和表前缀。 ```yaml datasource: url: jdbc:mysql://localhost:3306/quartz?useSSL=...
- 主要的Quartz数据库表包括`QRTZ_JOB_DETAILS`, `QRTZ_TRIGGERS`, `QRTZ_CRON_TRIGGERS`, `QRTZ_SIMPLE_TRIGGERS`, `QRTZ_BLOB_TRIGGERS`, `QRTZ_CALENDARS`, `QRTZ_PAUSED_TRIGGER_GRPS`, `QRTZ_FIRED_TRIGGERS`,...
Quartz是一款开源的作业调度框架...总的来说,Quartz的持久化数据库表是实现可靠定时任务调度的关键组成部分,它们提供了一种在系统崩溃或重启后能恢复任务调度的能力,使得Quartz成为许多企业级应用中不可或缺的工具。
8. **tables_derby.sql**:Apache Derby是Java的开源数据库,此脚本确保Quartz在Derby上的配置。 9. **tables_pointbase.sql**:PointBase是一款小型、快速的数据库系统,这个脚本是为了在PointBase上设置Quartz。 ...
3. 配置`quartz.properties`,指定数据库连接和Quartz参数。 4. 设计并实现`Job`和`Trigger`,定义任务逻辑和执行时机。 5. 在集群环境中,确保所有节点连接到同一个数据库,并共享任务信息。 通过这种方式,我们...
这个压缩包“Quartz.net 3.0.7.0数据库持久化.rar”包含了关于如何使用Quartz.NET实现任务调度的数据库持久化和集群配置的资料。Quartz.NET 3.0.7.0是该库的一个稳定版本,它提供了许多改进和新特性。 **数据库持久...
- 配置Quartz的`org.quartz.dataSource`属性,指定数据库连接信息。 - 使用`org.quartz.plugin.triggHistory`插件可以记录触发器的历史信息。 - 定义任务类(实现`Job`接口)和触发器(如`CronTrigger`或`...
2. **配置Quartz**:在`application.properties`或`application.yml`中配置Quartz,包括数据库连接信息、表名前缀、线程池大小等。这允许Quartz将任务和触发器存储在数据库中。 3. **创建Job和Trigger**:定义`Job`...
可以通过`quartz.properties`文件配置Quartz的一些全局参数,比如数据库连接、线程池大小等。例如: ``` org.quartz.scheduler.instanceName = MyScheduler org.quartz.jobStore.class = org.quartz.impl....
"quartz集群各种数据库建表脚本" 提供了在不同类型的数据库中创建Quartz集群所需的表结构。基于quartz2.2.1版本,这个脚本应该包含了创建必要的调度表,如QRTZ_JOB_DETAILS、QRTZ_TRIGGERS、QRTZ_SIMPLE_TRIGGERS等...
这些方法需要更新数据库中的相应记录,并通知Quartz重新加载任务配置。 4. **部署与测试**:项目部署在Tomcat服务器上,当服务器启动时,Quartz会自动加载数据库中的定时任务。通过监控日志或者定制的监控界面,...
Spring Quartz 动态配置时间 Spring Quartz 是一个功能强大的任务调度框架,广泛应用于 Java 企业级应用程序中。其中一个重要的功能便是动态配置时间,触发相应的任务。在本文中,我们将讨论如何使用 Spring Quartz...
在"quartz动态从数据库获取时间定时"的场景中,我们可以理解为Quartz的任务执行时间不是硬编码在程序中,而是从数据库中动态获取,这提供了更大的灵活性和可配置性。 首先,让我们来详细了解一下Quartz的核心概念:...
在“quartz实例sqlserver数据库连接”这个主题中,我们主要讨论如何配置Quartz与SQL Server数据库进行交互,以存储和管理调度信息。 首先,Quartz需要一个持久化存储来保存作业(Jobs)和触发器(Triggers)的信息...