如何解决无法在Quartz作业中注入依赖项
我试图将依赖项注入Quartz作业,但是每当触发我的作业时,我在注入的服务上都会出现NullPointerException。
我关注了一些有关如何解决该问题的教程/博客,但仍然存在。
请注意,根据某些业务逻辑,我将在第一个作业中创建多个作业。 /!\:调试时:JobExecutionContext.getScheduler()。getContext()。get(“ applicationContext”)为null 关于创建作业和触发器(甚至是CRON)的一切都很好。唯一的问题是我始终在“ campagneService”上使用NPE。
我的工作:
@Component
@DisallowConcurrentExecution
public class CreateAndCheckFirstCommandeJob implements Job {
@Autowired
private CampagneService campagneService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
*** buisiness Logic ****
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
JobDetail jobDetail= QuartzConfig.createQuartzJobDetail(a,b,c );
Trigger trigger= QuartzConfig.createQuartzSimpleTrigger(x,y,z,t);
scheduler.scheduleJob(jobDetail,trigger);
}
}
配置:
@Configuration
public class QuartzConfig {
private ApplicationContext applicationContext;
public QuartzConfig(ApplicationContext applicationContext,DataSource dataSource) {
this.applicationContext = applicationContext;
this.dataSource = dataSource;
}
@Bean
public SpringBeanJobFactory springBeanJobFactory() {
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
return jobFactory;
}
@Bean
public SchedulerFactoryBean scheduler(Trigger... triggers) {
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
Properties properties = new Properties();
properties.setProperty("org.quartz.scheduler.instanceName","SCHEDULER");
properties.setProperty("org.quartz.scheduler.instanceId","Scheduler-1");
schedulerFactory.setOverwriteExistingJobs(true);
schedulerFactory.setAutoStartup(true);
schedulerFactory.setQuartzProperties(properties);
schedulerFactory.setDataSource(dataSource);
schedulerFactory.setJobFactory(springBeanJobFactory());
schedulerFactory.setWaitForJobsToCompleteOnShutdown(true);
if (ArrayUtils.isNotEmpty(triggers)) {
schedulerFactory.setTriggers(triggers);
}
return schedulerFactory;
}
static JobDetail createQuartzJobDetail(Class jobClazz,String jobGroup,Map<String,Object> jobDataMap) {
String jobName = jobClazz.getSimpleName()
JobKey jobUniqueKey = new JobKey(jobName,jobGroup);
JobDetail jobDetail = JobBuilder.newJob(jobClazz)
.withIdentity(jobUniqueKey).build();
return jobDetail;
}
static Trigger createQuartzSimpleTrigger(JobDetail jobDetail,String triggerName,String triggerGroup,Date startingDate) {
return TriggerBuilder.newTrigger()
.withIdentity(triggerName,triggerGroup).forJob(jobDetail)
.startAt(startingDate)
.build();
}
static Trigger createQuartzCronTrigger(JobDetail jobDetail,Date endDate,String cronExpression) {
return TriggerBuilder.newTrigger()
.withIdentity( triggerName,triggerGroup)
.withSchedule(
CronScheduleBuilder.cronSchedule(cronExpression))
.endAt(endDate).forJob(jobDetail)
.build();
}
}
AutowiringSpringJobFactory:
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
private AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext ctx) {
beanFactory = ctx.getAutowireCapableBeanFactory();
}
@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);
return job;
}
}
堆栈strace(在:D的情况下) 第71行是我致电我的服务(this.campagneService.xxx)
2020-08-31 15:56:24.647 ERROR 8056 --- [eduler_Worker-1] org.quartz.core.JobRunShell : Job Cammande.CreateAndCheckPremiereCommandeJob15:56:14.434 threw an unhandled Exception:
java.lang.NullPointerException: null
at com.gtmt.scheduler.quartz.config.CreateAndCheckFirstCommandeJob.execute(CreateAndCheckFirstCommandeJob.java:71)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
2020-08-31 15:56:24.650 ERROR 8056 --- [eduler_Worker-1] org.quartz.core.ErrorLogger : Job (Cammande.CreateAndCheckFirstCommandeJob15:56:14.434 threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.NullPointerException: null
at com.gtmt.scheduler.quartz.config.CreateAndCheckFirstCommandeJob.execute(CreateAndCheckFirstCommandeJob.java:71)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 common frames omitted
Thanks.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。