gpt4 book ai didi

java - Spring + Quartz,触发器为空

转载 作者:行者123 更新时间:2023-11-30 02:44:33 26 4
gpt4 key购买 nike

我从几天前就和 Quartz 住在一起了..

我需要创建、应用程序启动、一些触发器和作业详细信息..

所以,这就是我的工作

@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 来管理 jobDetails 和触发器

@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();
}
}

启动应用程序时,@PostConstruct 方法尝试创建触发器,但在创建 jobManager 时出现异常

Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jobManager': Invocation of init method failed; nested exception is java.lang.NullPointerException

引起

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-context-support jar 4.2.5 版本中存在错误。

        sti.setJobKey(this.jobDetail.getKey());

即jobDetail 可以为 null。

在新版本中已修复。我查了4.3.2版本。

您可以使用 4.3.2 或更高版本。

4.3.2版本中

if (this.jobDetail != null) {
sti.setJobKey(this.jobDetail.getKey());
}

关于java - Spring + Quartz,触发器为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com