首页 > 开发 > Java > 正文

Spring Boot集成Quartz注入Spring管理的类的方法

2024-07-14 08:40:15
字体:
来源:转载
供稿:网友

在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入。

Spring有自己的Schedule定时任务,在Spring boot中使用的时候,不能动态管理JOB,于是就使用Quartz来实现。

在Spring Boot中配置Quartz:

 import java.io.IOException;import java.util.Properties;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.PropertiesFactoryBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ClassPathResource;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.quartz.SchedulerFactoryBean;@Configuration@EnableSchedulingpublic class QuartzSchedule {  @Autowired  private MyJobFactory myJobFactory;  @Bean  public SchedulerFactoryBean schedulerFactoryBean() throws IOException {    SchedulerFactoryBean factory = new SchedulerFactoryBean();    factory.setOverwriteExistingJobs(true);    // 延时启动    factory.setStartupDelay(20);    // 加载quartz数据源配置    factory.setQuartzProperties(quartzProperties());    // 自定义Job Factory,用于Spring注入    factory.setJobFactory(myJobFactory);    return factory;  }  /**   * 加载quartz数据源配置   *    * @return   * @throws IOException   */  @Bean  public Properties quartzProperties() throws IOException {    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();    propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));    propertiesFactoryBean.afterPropertiesSet();    return propertiesFactoryBean.getObject();  }}

为了在JOB中使用Spring管理的Bean,需要重新定义一个Job Factory:

 @Componentpublic class MyJobFactory extends AdaptableJobFactory {    @Autowired  private AutowireCapableBeanFactory capableBeanFactory;  @Override  protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {    // 调用父类的方法    Object jobInstance = super.createJobInstance(bundle);    // 进行注入    capableBeanFactory.autowireBean(jobInstance);    return jobInstance;  }} 

然后在JOB中就可以使用Spring管理的Bean了

 public class MyJob implements Job, Serializable {  private static final long serialVersionUID = 1L;  private Logger logger = LoggerFactory.getLogger(this.getClass());  @Autowired  private SomeService someService;  @Override  public void execute(JobExecutionContext context) throws JobExecutionException {    someService.doSomething();  }} 

下面代码是创建JOB:

      JobDetail jobDetail = JobBuilder.newJob(((Job) Class.forName(job.getClazz()).newInstance()).getClass())          .withIdentity(job.getJobName(), job.getJobGroup()).build();      jobDetail.getJobDataMap().put("extdata", job.getExtData());      // 表达式调度构建器      CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression())          .withMisfireHandlingInstructionDoNothing();      // 构建一个trigger      TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(triggerKey)          .withSchedule(scheduleBuilder);      if (job.getStartTime() != null) {        triggerBuilder.startAt(job.getStartTime());      }      if (job.getEndTime() != null) {        triggerBuilder.endAt(job.getEndTime());      }      CronTrigger trigger = triggerBuilder.build();      scheduler.scheduleJob(jobDetail, trigger);// 注入到管理类 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表