随即通知所有已完成的时间表

时间:2018-10-01 09:51:16

标签: java spring scheduled-tasks taskscheduler spring-scheduled

我有一个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事件到桌子?赞赏是否给出了一些例子的答案。

1 个答案:

答案 0 :(得分:0)

由于您无需跟踪reportSchedules,因此我很想做类似的事情:

  • 移动使用Queue,以便在String时删除poll
  • 跟踪您提交的任务数。 (*)
  • 添加自定义ApplicationEvent类型的ReportScheduleProcessedEvent(或类似名称),并在ApplicationEventPublisher的{​​{末尾)发布其中一个(到Spring的ReportTask)。 1}}方法。
  • 为此类型添加一个新的run,直到收到与(*)中跟踪的事件一样多的事件;然后将一些内容发布到数据库中。

恐怕我在这里没有提供任何代码,因为您可能会或不需要在以上几点关注线程安全,并且适当地处理它可能并不容易。


编辑;每个评论要求提供样本。我假设您至少使用spring 4.3。

编辑编辑:每评论更多。

ApplicationListener