У меня есть следующий @Component, который имеет list of reportSchedules...
Они переведены в ReportTask
готовый к запуску и запланированы к выполнению через некоторое время в будущем ..
@Component
public class RegisterReportSchedules implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private ThreadPoolTaskScheduler ts;
private List<String> reportSchedules; //contains list of report schedules
@Autowired
private SomeTask sometask;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
reportSchedules.forEach((String schedule) -> {
ReportSchedule reportSchedule = new ReportSchedule(schedule,
propertiesUtil.getProperty(schedule + "." + Constants.CRON));
ts.schedule(new ReportTask(reportSchedule),
new CronTrigger(reportSchedule.getCronExpression()));
});
}
class ReportTask implements Runnable {
private ReportSchedule schedule;
public ReportTask(ReportSchedule schedule) {
this.schedule = schedule;
}
@Override
public void run() {
sometask.process(schedule);
applicationEventPublisher.publishEvent(new ReportScheduleProcessedEvent(this, schedule.getSchedule()));
}
}
}
Каждый раз, когда обрабатывается ReportTask
, я хочу опубликовать событие и присоединить к нему слушателя.
public class ReportScheduleProcessedEvent extends ApplicationEvent {
private String schedule;
public ReportScheduleProcessedEvent(Object source, String schedule) {
super(source);
this.schedule = schedule;
}
public String getSchedule() {
return schedule;
}
}
Это слушатель:
@Component
public class ReportScheduledProcessedListener implements ApplicationListener<ReportScheduleProcessedEvent> {
@Override
public void onApplicationEvent(ReportScheduleProcessedEvent reportScheduleProcessedEvent) {
//receive events, count how many received against initial list and then initiate database write..
}
}
когда все reportSchedules
обработаны, я хочу записать событие в таблицу базы данных.Итак, в операции onApplicationEvent()
как я могу определить, что все мои reportSchedules были обработаны, а затем вызвать функцию, готовую записать запись в таблицу?
Где я могу отслеживать количество выполненных?