Уведомление обо всех выполненных графиках с помощью пружин - PullRequest
0 голосов
/ 01 октября 2018

У меня есть приложение на 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 были завершены, мне нужно записать в таблицу БД одну запись, чтобы сказать, что все задачи отчета выполнены.

Но как я могу отследить, как эта информация о каждом расписании отчетов завершается в моей заявке?

Нужно ли записывать в таблицу базы данных для каждого выполненного расписания, или в Spring есть лучшая альтернатива, которая вызовет какое-либо событие уведомления, которое я затем смогу использовать для записи события ALL COMPLETED встол?Цените, если даны некоторые ответы с примерами.

1 Ответ

0 голосов
/ 01 октября 2018

Поскольку вам не нужно отслеживать reportSchedules, у меня возникнет соблазн сделать что-то вроде:

  • Перейдите, чтобы использовать Queue, чтобы String sудаляется при poll.
  • Отслеживании количества задач, которые вы отправляете.(*)
  • Добавьте пользовательский тип ApplicationEvent ReportScheduleProcessedEvent (или аналогичный) и опубликуйте один из них (в ApplicationEventPublisher Spring) в конце ReportTask s run метода.
  • Добавьте новый ApplicationListener для этого типа, который ожидает, пока не получит столько событий, сколько вы отслеживали в (*);а затем публикует что-то в базу данных.

Боюсь, что я не предоставил здесь никакого кода, так как вам может понадобиться, а может и нет, заботиться о безопасности потоков в нескольких пунктах выше,и обработка этого может быть не тривиальной.


Редактировать;за комментарий просят образец.Я предполагаю, что вы используете по крайней мере весной 4.3.

Редактировать Редактировать: для большего количества комментариев.

abstract class ReportScheduleEvent extends ApplicationEvent { ... }

public class IncomingReportCompletionEvent
        extends ReportScheduleEvent {

    private final int eventsToExpect;
    // ...
}

public class ReportCompletionEvent extends ReportSchedulingEvent {
    // ...
}

public class YourListener
    implements ApplicationListener<ReportSchedulingEvent> {

    private final DatabaseWriter dbWriter;
    private volatile int expectedEvents = 0;

    public void onApplicationEvent(final ReportSchedulingEvent event) {
        if (event instanceof IncomingReportCompletionEvent) {
            this.expectedEvents = 
                    ((IncomingReportCompletionEvent) event)
                    .getExpectedEventCount();
        } else {
            this.expectedEvents--;
            if (this.expectedEvents == 0) {
                this.dbWriter.doYourThing();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...