Java 弹簧&x2B;石英,触发器为空
我和石英住在一起 我需要创建,应用程序启动,一些触发器和工作细节 这是我的工作Java 弹簧&x2B;石英,触发器为空,java,spring,Java,Spring,我和石英住在一起 我需要创建,应用程序启动,一些触发器和工作细节 这是我的工作 @DisallowConcurrentExecution public class TimeoutJob extends QuartzJobBean{ public final String ID = "idInterruttore"; private final Logger logger = Logger.getLogger(TimeoutJob.class); @Autowired
@DisallowConcurrentExecution
public class TimeoutJob extends QuartzJobBean{
public final String ID = "idInterruttore";
private final Logger logger = Logger.getLogger(TimeoutJob.class);
@Autowired InterruttoreService interruttoreService;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
int idInterruttore = dataMap.getIntFromString(ID);
Interruttore interruttore = interruttoreService.findById(idInterruttore);
logger.debug("Job reached for " + interruttore.getNomeInterruttore());
}
}
然后在QuartzConfiguration.java中配置一些bean
@Configuration
@ComponentScan("it.besmart")
public class QuartzConfiguration {
@Autowired
ApplicationContext applicationContext;
@Bean
public SchedulerFactoryBean scheduler() {
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
schedulerFactory.setJobFactory(springBeanJobFactory());
return schedulerFactory;
}
@Bean
public SpringBeanJobFactory springBeanJobFactory() {
AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
return jobFactory;
}
}
现在,我有一个JobManager.class,它管理作业详细信息和触发器
@Service("jobManager")
public class JobManager {
private final Logger logger = Logger.getLogger(JobManager.class);
@Autowired
SchedulerFactoryBean scheduler;
@Autowired
InterruttoreService interruttoreService;
@PostConstruct
public void createInitialJobs() {
logger.debug("Start ut jobs to create");
List<Interruttore> interruttori = interruttoreService.findAllSwitches();
Date now = new Date();
for (int i = 0; i < interruttori.size(); i++) {
Interruttore interruttore = interruttori.get(i);
if (interruttore.getTimeoutDate().after(now) && interruttore.isStato()) {
// JobDetail and Trigger creation
createJob(interruttore, interruttore.getTimeoutDate());
}
}
}
public void createJob(Interruttore interruttore, Date richiesta) {
JobDetailFactoryBean jobDetail = new JobDetailFactoryBean();
jobDetail.setJobClass(TimeoutJob.class);
jobDetail.setName("Job detail for " + interruttore.getNomeInterruttore());
jobDetail.setDescription("Job Description");
jobDetail.setDurability(true);
Map<String, Integer> map = new HashMap<String,Integer>();
map.put("idInterruttore", interruttore.getIdInterruttore());
jobDetail.setJobDataAsMap(map);
long future = richiesta.getTime() - new Date().getTime();
logger.debug("next timeout is " + future / 1000 / 60 + " minuti for " + interruttore.getNomeInterruttore());
//trigger creation
SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
trigger.setName("myTrigger"+interruttore.getNomeInterruttore());
trigger.setGroup("timeoutTriggers");
trigger.setJobDetail(jobDetail.getObject());
trigger.setStartDelay(0);
trigger.setRepeatCount(1);
trigger.setRepeatInterval(future);
trigger.afterPropertiesSet();
logger.debug("Trigger for " + interruttore.getNomeInterruttore());
logger.debug("Trigger object is :" + trigger.getObject());
logger.debug("Next Trigger date " + trigger.getObject().getFinalFireTime());
try {
scheduler.getScheduler().scheduleJob(jobDetail.getObject(), trigger.getObject());
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
引起
Caused by: java.lang.NullPointerException
at org.springframework.scheduling.quartz.SimpleTriggerFactoryBean.afterPropertiesSet(SimpleTriggerFactoryBean.java:231)
at it.besmart.quartz.JobManager.createJob(JobManager.java:85)
at it.besmart.quartz.JobManager.createInitialJobs(JobManager.java:54)
那是
trigger.afterPropertiesSet();
由于没有创建我的触发器…spring上下文支持JAR4.2.5版本中有一个bug
sti.setJobKey(this.jobDetail.getKey());
i、 e.作业详细信息可以为空
在新版本中,它是固定的。我检查了4.3.2版本
您可以使用4.3.2或更高版本
在4.3.2版本中
if (this.jobDetail != null) {
sti.setJobKey(this.jobDetail.getKey());
}
您的spring上下文支持jar版本是什么?我正在使用spring Boot 1.3.3和spring上下文支持4.2.5这个版本4.2.5.RELEASE?是的,4.2.5.RELEASE是的,我升级了我所有的jar,但我得到了
org.quartz.SchedulerException:JobDetail不能在org.quartz.core.QuartzScheduler.scheduler.scheduleJob(QuartzScheduler.java:849)为空在org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)在it.besmart.quartz.JobManager.createJob(JobManager.java:91)在it.besmart.quartz.JobManager.createInitialJobs(JobManager.java:54)
这是调度程序.getScheduleJob().scheduleJob(jobDetail.getObject(),trigger.getObject())代码>我正在使用4.3.3.RELEASE作为版本您没有调用jobDetail.AfterPropertieSet()就像您为triggercool所做的那样:)。。不客气。。你对quartz还有其他问题吗?现在我必须在超时改变时动态管理触发器的更新,如果我有问题,我会知道该问谁!
if (this.jobDetail != null) {
sti.setJobKey(this.jobDetail.getKey());
}