在 Java 中使用 Quartz 动态刷新 Cron 表达式有多种实现方式。以下是其中几种常见的方式,每种方式都会提供详细的步骤流程和示例代码。
添加 Maven 依赖(Quartz):
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
创建一个 Job 类:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 你的任务逻辑
System.out.println("Job is running...");
}
}
创建 Quartz Scheduler 和 JobDetail:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class DynamicCronExample {
public static void main(String[] args) throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.build();
// 初始化 CronTrigger,Cron 表达式暂时使用一个初始值
CronTrigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) // 初始 Cron 表达式
.build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
}
动态刷新 Cron 表达式:
// 获取现有的 CronTrigger
TriggerKey triggerKey = new TriggerKey("myTrigger", "group1");
CronTrigger oldTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 创建新的 CronTrigger
CronTrigger newTrigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) // 新的 Cron 表达式
.build();
// 更新任务的 CronTrigger
scheduler.rescheduleJob(triggerKey, newTrigger);
添加 Maven 依赖(Spring 和 Quartz):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
@Configuration
public class QuartzConfig {
@Bean
public JobDetailFactoryBean jobDetail() {
return new JobDetailFactoryBeanBuilder()
.jobClass(MyJob.class)
.build();
}
@Bean
public CronTriggerFactoryBean cronTrigger() {
return new CronTriggerFactoryBeanBuilder()
.jobDetail(jobDetail().getObject())
.cronExpression("0/10 * * * * ?") // 初始 Cron 表达式
.build();
}
}
动态刷新 Cron 表达式:
@Autowired
private CronTriggerFactoryBean cronTrigger;
// 更新 Cron 表达式
cronTrigger.setCronExpression("0/5 * * * * ?");
cronTrigger.afterPropertiesSet(); // 刷新 Cron 表达式
这两种方式都可以实现动态刷新 Quartz Job 的 Cron 表达式。方式一适用于纯 Quartz 使用场景,而方式二适用于 Spring 集成 Quartz 的情况。在实际使用中,你可以根据项目需要选择合适的方式。请注意,示例中的部分类名、方法名可能需要根据实际情况进行适当的调整。