Spring @Scheduled task в нескольких часовых поясах - PullRequest
0 голосов
/ 04 октября 2018

У меня есть клиент, который работает по всей территории США (во всех часовых поясах).Мне нужно запустить задачу в 2 часа ночи в каждом часовом поясе.Для этой задачи необходим часовой пояс в качестве входных данных для выборки записей, относящихся только к этой зоне.

@ Запланированная аннотация имеет значение timezone, которое работает по одному часовому поясу за раз.

Я не хочу дублировать код, имея 4 отдельных задания для каждой зоны.

Ответы [ 3 ]

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

Можете ли вы попробовать этот подход?В соответствии с java 8 повторяющимися аннотациями документов это должно работать, @ Repeatable уже включен в @Scheduled, поэтому нет необходимости объявлять @scheduled снова с @Repeatable annotation

org.springframework.scheduling.annotation.Scheduled

@ Repeatable (value = Schedules.class) @Target (value = {ANNOTATION_TYPE, METHOD}) @Retention (value = RUNTIME) @ Документированный

   @Scheduled(cron = "0 1 1,13 * * ?", zone = "CST")
    @Scheduled(cron = "0 1 1,15 * * ?", zone = "SGT")
    public void doScheduledWork() {
        //complete scheduled work
    }
.
.
.

связанные документы / ссылки: java-8 повторяемых пользовательских аннотаций https://www.javatpoint.com/java-8-type-annotations-and-repeating-annotations

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

Это должно сделать это для вас.

@Slf4j
@Configuration
public class TestBean implements SmartInitializingSingleton {

  @Inject
  TaskScheduler scheduler;

  @Bean
  public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler te = new ThreadPoolTaskScheduler();
    te.setPoolSize(4);
    return te;
  }

  @Override
  public void afterSingletonsInstantiated() {

    Arrays.stream(new String[] {"PST", "MST", "CST", "EST"})
        .forEach(zone -> {
          scheduler.schedule(() -> {
            log.info("Zone trigged: {}", zone);
          }, new CronTrigger("0 0 2 * * *", TimeZone.getTimeZone(zone)));
        });
  }
}

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

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

Использование свойства зоны с аннотацией @Scheduled, (дополнение к версии 4.0) См. Пример ниже

@Scheduled(cron = "0 10 19 * * FRI", zone = "CET") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...