Quartz动态修改数据库cronExpression(无须重启服务器即可更改定时时间)
时间: 2023-08-02 21:08:44 浏览: 105
Spring + quartz 定时任务修改定时时间不重启服务
要实现Quartz动态修改数据库中的cronExpression,可以按照以下步骤进行操作:
1. 首先,需要在数据库中创建一个表,用于存储定时任务的配置信息。可以创建一个表,包含以下字段:job_name、job_group、cron_expression、job_class、job_data。
2. 在Quartz配置文件中,需要配置一个JobStore,用于将定时任务的配置信息存储到数据库中。可以使用JDBCJobStore,配置方式如下:
```
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_
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost/quartz
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = root
```
3. 创建一个定时任务类,实现org.quartz.Job接口,并在execute方法中编写定时任务的具体逻辑。
4. 在代码中获取Scheduler实例,并使用JobBuilder创建定时任务。
```
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("job1", "group1")
.build();
```
5. 使用TriggerBuilder创建Trigger,并设置定时任务的执行时间。这里需要设置一个初始的cronExpression。
```
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?"))
.build();
```
6. 将定时任务和Trigger添加到Scheduler中,并启动Scheduler。
```
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
```
7. 当需要修改定时任务的执行时间时,可以先获取当前的Trigger,并使用TriggerBuilder修改cronExpression。
```
TriggerKey triggerKey = TriggerKey.triggerKey("trigger1", "group1");
Trigger trigger = scheduler.getTrigger(triggerKey);
trigger = trigger.getTriggerBuilder()
.withIdentity(triggerKey)
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 * * * ?"))
.build();
```
8. 最后,使用Scheduler的rescheduleJob方法,将修改后的Trigger更新到Scheduler中。
```
scheduler.rescheduleJob(triggerKey, trigger);
```
这样,就可以实现Quartz动态修改数据库中的cronExpression,而无需重启服务器即可生效。
阅读全文