解决quartz定时任务spring注入Services时空指针问题

一、问题描述:

使用quartz实现动态任务时,在job定时任务中使用某个service时,通过加注解@Component、@Autowired注入时,定时任务执行时,获取的demoService 对象为null
实例代码如下:

public class DemoJob implements Job{  
    @Autowired  
    private DemoService demoService ; 
	@Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { 
    	//实现业务代码
    	List<String> list = demoService.query();
    }
}  

二、解决办法
1.自定义一个JobFactory,

/***
 * 解决调用service  空指针
 */
@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

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

2.配置QuartzConfig ,把JobFactory 添加到factoryBean里面

@Configuration
public class QuartzConfig {

    private static final Logger logger = LoggerFactory.getLogger(QuartzConfig .class);
    @Autowired
    public JobFactory jobFactory;
    /**
     * 方法名:
     * 功能:定义quartz调度工厂
     */
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
        factoryBean.setJobFactory(jobFactory);
        //是否覆盖之前的定时任务
        factoryBean.setOverwriteExistingJobs(true);
        // 延时启动(秒)
        factoryBean.setStartupDelay(0);
        logger.info("scheduler 初始化成功!");
        return factoryBean;
    }

3.定时任务配置,使用factoryBean里面Scheduler创建job任务

@Component
public class TaskScheduler {
    private static Log log = LogFactory.getLog(TaskScheduler.class);

    @Autowired
    SchedulerFactoryBean schedulerFactory;

    @Autowired
    private Scheduler scheduler;

    /**
     * 初始化  添加邮件发送任务
     */
    @PostConstruct
    public void init() {
        try {
                JobDetail jobDetail=JobBuilder.newJob(DemoJob .class).withIdentity("job", "test").build();
                String cron = "00 00 21 * * ?";
                jobDetail.getJobDataMap().put("cron", cron);
                CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "t1").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
                scheduler.scheduleJob(jobDetail7, trigger7);
            }
            scheduler.start();
        } catch (Exception e) {
            log.info("初始化", e);
        }
    }
     /**
     * 添加一个定时任务
     *
     * @param jobName          任务名
     * @param jobGroupName     任务组名
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     * @param jobClass         任务
     * @param cron             时间设置,参考quartz说明文档
     */
    @SuppressWarnings({"unchecked", "rawtypes"})
    public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron) {
        try {
            scheduler = schedulerFactory.getScheduler();
            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            triggerBuilder.withIdentity(triggerName, triggerGroupName);
            triggerBuilder.startNow();
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            CronTrigger trigger = (CronTrigger) triggerBuilder.build();
            scheduler.scheduleJob(jobDetail, trigger);
            if (!scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (Exception e) {
            log.info("添加任务出现异常!,{}", e);
        }
    }

    /**
     * 修改一个任务的触发时间
     *
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     * @param cron             时间设置,参考quartz说明文档
     */
    public void modifyJobTime(String triggerName, String triggerGroupName, String cron) {
        try {
            scheduler = schedulerFactory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return;
            }
            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)) {
                //方式一 :调用 rescheduleJob 开始
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                triggerBuilder.withIdentity(triggerName, triggerGroupName);
                triggerBuilder.startNow();
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                trigger = (CronTrigger) triggerBuilder.build();
                // 方式一 :修改一个任务的触发时间
                scheduler.rescheduleJob(triggerKey, trigger);
            }
        } catch (Exception e) {
            log.info("修改任务出现异常!,{}", e);
        }
    }

    /**
     * 移除一个任务
     *
     * @param jobName          任务名
     * @param jobGroupName     任务组名
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     */
    public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
        try {
            scheduler = schedulerFactory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            scheduler.pauseTrigger(triggerKey);
            scheduler.unscheduleJob(triggerKey);
            scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
        } catch (Exception e) {
            log.info("移除任务出现异常!,{}", e);
        }
    }
}

阿里云推广

解决quartz定时任务spring注入Services时空指针问题_第1张图片

你可能感兴趣的:(java应用)