Spring ThreadPoolTaskExecutor с фиксированной задержкой?

У меня есть задание, которое планируется запускать каждый час, которое использует компонент Spring ThreadPoolTaskExecutor для одновременных вызовов (около 100 вызовов каждый час) к внешнему API.

@Bean
public TaskExecutor getExecutor() {
    ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
    threadPoolTaskExecutor.setCorePoolSize(10);
    threadPoolTaskExecutor.setMaxPoolSize(20);
    return threadPoolTaskExecutor;
}

Теперь внешний API ограничил количество запросов и разрешает один запрос каждые 30 секунд. Перед каждым звонком мне придется ждать 30 секунд.

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

Как лучше всего справиться с подобным ограничением API? Пожалуйста помоги

Я использую Java 8, Spring Boot 2.0.1, если это помогает

Вы действительно знаете о решении, планировщик ThreadPoolTaskScheduler с 30-секундным триггером с задержкой будет работать. Почему бы вам просто не реализовать это? Есть какие-то причины?

tmarwen 08.11.2018 11:13

@tmarwen Я использовал @Scheduled с выражением cron в реальном задании, которое выполняется каждый час. Могу ли я иметь одновременное расписание фиксированной задержки в ThreadPoolTaskScheduler?

Ram 08.11.2018 11:19

@ jusemar10 Вы можете управлять расписанием в аннотации @Scheduled и оставить ThreadPoolTaskScheduler в покое.

Arun Patra 08.11.2018 13:54

Я предполагаю, что вам действительно нужен какой-то способ распределить вызовы, чтобы он знал, сколько времени прошло с момента последнего, и помещает их в очередь, если задачи требуют дросселирования. Хотя ничто из этого не поможет, если вы не измените свое приложение значимым образом: вам нужно изменить его, чтобы оно увеличилось со 100 вызовов в минуту до максимум 2 вызовов. Это недостижимо, если просто задушить исполнителя.

M. Prokhorov 08.11.2018 14:26

... потому что, если вы просто измените исполнителя и по-прежнему загрузите его со 100 задачами, в то время как он может обрабатывать не более 2, очередь задач будет очень быстро загрязнена (по крайней мере, 98 в минуту, если быть точным).

M. Prokhorov 08.11.2018 14:28

@ m-prokhorov Наверное, в моем сценарии подойдет очередь?

Ram 09.11.2018 17:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
851
1

Ответы 1

Вы могли сделать следующее.

  1. Настройте TaskExecutor. Вы это уже сделали.
  2. Напишите метод, который вы хотите вызывать по расписанию и аннотировать с помощью @Scheduled.

     @Scheduled(fixedDelay = 3600000)
     void doSomething() {
     }
    

Приведенный выше код будет запускаться каждые 1 час.

У меня уже есть такая установка. Мой вопрос в том, как ограничить вызов API, который в настоящее время запускается примерно 100 раз параллельно при каждом запуске задания.

Ram 08.11.2018 14:13

Это всегда будет ограничивать выполнение задачи, даже если в течение последних 10 минут задачи не выполнялись.

M. Prokhorov 08.11.2018 14:24

Согласен с @ M.Prokhorov. Ваша проблема не в области инфраструктуры планирования, предоставляемой Spring. Вероятно, вам придется построить свою собственную логику. Возможно, ваша собственная пользовательская логика (или повторно используйте более низкий уровень инфраструктуры управления задачами из самой Java или Spring) для отправки задач на промежуточный процессор. Этот промежуточный процессор будет отслеживать временные метки и координировать правильную задержку между последовательными отправками.

Arun Patra 09.11.2018 07:04

Другие вопросы по теме