我有一个Java,Spring应用程序,我在其中计划一些报表作业。该组件如下所示:
@Component
public class RegisterReportSchedules implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private ThreadPoolTaskScheduler ts;
private List<String> reportSchedules; //contains list of report schedules
@Autowired
private SomeTask sometask;
@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);
}
}
}
说我有5个reportSchedules
要处理。完成所有5个ReportTasks
之后,我需要向db表中写入一个条目以说所有报告任务均已完成。
但是如何在应用程序中跟踪有关每个报告计划的信息?
我是否需要为每个已完成的调度表写入数据库表,或者在Spring
中是否有更好的选择来触发某种通知事件,然后可以使用该通知事件来编写ALL COMPLETED
事件到桌子?赞赏是否给出了一些例子的答案。
答案 0 :(得分:0)
由于您无需跟踪reportSchedules
,因此我很想做类似的事情:
Queue
,以便在String
时删除poll
。ApplicationEvent
类型的ReportScheduleProcessedEvent
(或类似名称),并在ApplicationEventPublisher
的{{末尾)发布其中一个(到Spring的ReportTask
)。 1}}方法。run
,直到收到与(*)中跟踪的事件一样多的事件;然后将一些内容发布到数据库中。恐怕我在这里没有提供任何代码,因为您可能会或不需要在以上几点关注线程安全,并且适当地处理它可能并不容易。
编辑;每个评论要求提供样本。我假设您至少使用spring 4.3。
编辑编辑:每评论更多。
ApplicationListener