Quartz解决无法注入bean问题,以及选用自己定义构造器实例化

1、通过@Autowired注入所需要的bean

自定义JobFactory

@Component
public class JobFactory extends AdaptableJobFactory {

    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    
    @Override
    protected Object createJobInstance(TriggerFiredBundle triggerFiredBundle) throws Exception {
    //调用父类的方法
        Object jobInstance = super.createJobInstance(triggerFiredBundle);
        //进行注入,交给spring容器管理
        capableBeanFactory.autowireBean(jobInstance);
        
        return jobInstance;
    }
}
2、可以通过有参构造实例化job
自定义JobFactory
@Component
public class JobFactory extends AdaptableJobFactory {

    private AutowireCapableBeanFactory capableBeanFactory;

    public QuartzJobFactory(AutowireCapableBeanFactory capableBeanFactory) {
        this.capableBeanFactory = capableBeanFactory;
    }

    @Override
    protected Object createJobInstance(TriggerFiredBundle triggerFiredBundle) throws Exception {
        Class<?> jobClass = triggerFiredBundle.getJobDetail().getJobClass();

        //根据自己的构造器创建
        return capableBeanFactory.createBean(jobClass);
    }
}
以上俩中方式可以自行选择,然后将自定义的JobFactory设置给scheduler
@Configuration
public class QuartzConfig {

    @Autowired
    private JobFactory jobFactory;

    @Bean
    @SneakyThrows
    public Scheduler scheduler() {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 自定义 JobFactory 使得在 Quartz Job 中可以使用 @Autowired/有参构造
        scheduler.setJobFactory(jobFactory);
        scheduler.start();
        return scheduler;
    }
}
ScheduleManager工具类,可以开启一个job,删除一个job,下面是有参构造的形式
@Component
public class ScheduleManager {

    private Scheduler scheduler;

    public ScheduleManager(Scheduler scheduler) {
        this.scheduler = scheduler;
    }

    public void start(JobParamter jobParamter, Class<? extends Job> jobClass) {

        //创建任务
        JobDetail jobDetail = JobBuilder
                .newJob(jobClass)
                .withIdentity(jobParamter.getJobName())
                .build();
        //创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(jobParamter.getJobName())
                .withSchedule(CronScheduleBuilder.cronSchedule(jobParamter.getJobCron()))
                .build();
        try {
            //将任务及其触发器放入调度器
            scheduler.scheduleJob(jobDetail, trigger);
            //调度器开始调度任务
            if (!scheduler.isStarted()) {
                scheduler.start();
            }

            log.info("启动任务:{}", jobParamter.getJobName());
        } catch (SchedulerException e) {
            log.error("任务:{}启动失败", jobParamter.getJobName(), e);
        }

    }


    /**
     * 停止任务--再启动需要从新初始化
     *
     * @param jobParamter
     */
    public void stop(JobParamter jobParamter) {
        try {
            // 停止触发器
            scheduler.pauseTrigger(new TriggerKey(jobParamter.getJobName()));
            scheduler.unscheduleJob(new TriggerKey(jobParamter.getJobName()));
            // 删除任务
            scheduler.deleteJob(new JobKey(jobParamter.getJobName()));
            log.info("停止任务:{}", jobParamter.getJobName());
        } catch (SchedulerException e) {
            log.error("任务:{}停止失败", jobParamter.getJobName(), e);
        }
    }
}

job实现类

//@Autowired形式
public class ExampleJob implements Job {

    @Autowired
    private RestTemplateWrapper restTemplateWrapper;
    

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
       //具体业务
    }
}


//有参构造形式
public class ExampleJob implements Job {
    private RestTemplateWrapper restTemplateWrapper;
    

    public ExampleJob (RestTemplateWrapper restTemplateWrapper) {
        this.restTemplateWrapper = restTemplateWrapper;
        
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
       //具体业务
    }
}

需要引入的包

<dependency>
    <groupId>org.springframework</groupId>
     <artifactId>spring-context-support</artifactId>
     <version>4.3.8.RELEASE</version>
</dependency>
<dependency>
     <groupId>org.quartz-scheduler</groupId>
     <artifactId>quartz</artifactId>
     <version>2.3.2</version>
 </dependency>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值