Spring任务调度 Quartz
任务基类
-
1 定义getCron(),方便获取每个任务的定时调度参数
public abstract class AbstractExchanger implements Job {
public abstract String getCron();
}
任务触发器
关键点:
-
1 加注解 @Component,使这个bean被Sping管理
-
2 实现ApplicationContextAware,确保可以在项目启动的时候任务执行
-
3 获取scheduler
-
4 获取所有实现任务基类的bean: ctx.getBeansOfType(AbstractExchanger.class).values(),
并将它们添加到scheduler:
scheduler.scheduleJob(jobDetail, trigger);
@Component
public class ExchangerTrigger implements ApplicationContextAware {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private ApplicationContext ctx = null;
public void trigger() {
Scheduler scheduler = null;
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
for(AbstractExchanger exchanger : ctx.getBeansOfType(AbstractExchanger.class).values()) {
logger.info("建立同步定时任务:{}", JSON.toJSONString(exchanger));
JobDetail jobDetail = JobBuilder.newJob(exchanger.getClass()).withIdentity(exchanger.toString() + "Job").build();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TriggerKey.triggerKey(exchanger.toString() + "Trigger", "myTriggerGroup"))
.withSchedule(CronScheduleBuilder.cronSchedule(exchanger.getCron()))
.build();
scheduler.scheduleJob(jobDetail, trigger);
}
scheduler.start();
} catch (Exception e) {
logger.error("数据交换任务定时器启动失败。", e);
return;
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
ctx = applicationContext;
this.trigger();
}
}
任务实现类
@Component
public class AlarmInfoHandler extends AbstractExchanger {
public void send (){
}
@Override
public String getCron() {
//获取定时任务执行参数
}
//具体业务执行
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
send();
}
}
2.
maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>