我的自定义工作 - 投票工作
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
logger.info("Executing Poll Job");
Observable.fromIterable(store::all)
.filter(keyValue -> keyValue.value.getPolling() == true)
.map(keyValue -> keyValue.key)
.subscribe(
details -> {
queryScheduler.scheduleQuery(details);
} catch (Exception e) {
e.printStackTrace();
}
},
onError -> {
if (onError instanceof MetadataFailureException) {
logger.error("Failed to acquire metadata");
}
});
} catch (Exception e) {
logger.error("Error in poll job", e);
}
}
利用KafkaStreams ReadOnlyKeyValueStore获取数据,然后需要在第二个调度程序上使用第二个Quartz作业来使用该数据。 queryScheduler对象只是另一个调度新Job的Quartz Scheduler的包装器。
我的PollJob设置了以下JobDetail和Trigger -
JobDetail hourlyJob = JobBuilder.newJob(PollJob.class).build();
Trigger hourlyTrigger =
TriggerBuilder.newTrigger()
.forJob(hourlyJob)
.startNow()
.withSchedule(SimpleScheduleBuilder.repeatMinutelyForTotalCount(1))
.build();
这显然只打算执行一次,但是PollJob的执行方法无限执行。
queryScheduler.scheduleQuery(details)
看起来像 -
public void scheduleQuery(AvroSymbolDetails details) {
JobDetail query = buildQuery(details);
Trigger queryTrigger =
TriggerBuilder.newTrigger()
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(5))
.startNow()
.build();
try {
logger.info("Scheduling query job");
scheduler.scheduleJob(query, queryTrigger);
} catch (SchedulerException e) { // TODO Auto-generated catch block
logger.error("Error scheduling query job for symbol: " + details.getSymbol().toString(), e);
}
}
其中buildQuery方法只是将一些字符串添加到JobDataMap。
从PollJob中删除该行代码会导致此行为失败。我的理论是关于在第一个作业中在第二个调度程序上调度作业的某些事情会导致某些事情中断,但我不确定什么,因为PollJob执行方法永远不会捕获异常。
PollJob有一个自定义的JobFactory将事物传递给PollJob的构造函数。仅在使用自定义JobFactory时才会出现此问题。即使工厂没有通过PollJob,行为仍然会发生。
感谢任何帮助!