Как создать несколько запланированных задач с разными фиксированными ставками весной?

#java #spring

Вопрос:

Мне нужно иметь два планировщика, каждый из которых запускается с разными фиксированными интервалами. Мне также нужна возможность останавливаться и начинать в quoteScheduler зависимости от того, открыт фондовый рынок США или нет.

quoteScheduler Необходимо запускать один раз в минуту, если фондовый рынок США открыт. Но мне нужно только проверить, открыт ли фондовый рынок США реже (скажем, каждые 10 минут). Как я могу настроить его так, marketDataScheduler чтобы он запускался каждые 10 минут и мог запускать и останавливать мой quoteScheduler , который будет запускаться каждые 1 минуту только тогда, когда marketDataScheduler он скажет начать.

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

 @Configuration
@EnableScheduling
public class QuoteSchedulerConfiguration {

    @Scheduled(fixedRate = 60000)
    public void scheduleByFixedRate() {
    }
}
 
 @Service
public class QuoteServiceScheduler {

    private final ScheduledAnnotationBeanPostProcessor postProcessor;
    private final QuoteSchedulerConfiguration schedulerConfiguration;
    private final QuoteService quoteService;

    public QuoteServiceScheduler(QuoteService quoteService,
                                 ScheduledAnnotationBeanPostProcessor postProcessor,
                                 QuoteSchedulerConfiguration schedulerConfiguration) {
        this.postProcessor = postProcessor;
        this.schedulerConfiguration = schedulerConfiguration;
        this.quoteService = quoteService;
    }

    public void startSchedule() {
        postProcessor.postProcessAfterInitialization(schedulerConfiguration, "");
        quoteService.getLatestPrices();
    }

    public void stopSchedule() {
        postProcessor.postProcessBeforeDestruction(schedulerConfiguration, "");
    }
 
 @Configuration
@EnableScheduling
public class MarketDataSchedulerConfiguration {

    private final MarketDataScheduler marketDataScheduler;

    public MarketDataSchedulerConfiguration(MarketDataScheduler marketDataScheduler) {
        this.marketDataScheduler = marketDataScheduler;
    }

    @Scheduled(fixedRate = 60 * 1000 * 10)
    public void scheduleByFixedRate() {
        marketDataScheduler.startSchedule();
    }
}
 
 @Service
public class MarketDataScheduler {

    private final MarketDataServiceImpl marketDataServiceImpl;
    private final QuoteServiceScheduler quoteServiceScheduler;

    public MarketDataScheduler(MarketDataServiceImpl marketDataServiceImpl,
                               QuoteServiceScheduler quoteServiceScheduler) {
        this.marketDataServiceImpl = marketDataServiceImpl;
        this.quoteServiceScheduler = quoteServiceScheduler;
    }


    public void startSchedule() {
        if (isUSMarketOpen()) {
            quoteServiceScheduler.startSchedule();
        } else {
            quoteServiceScheduler.stopSchedule();
        }
    }
 

Комментарии:

1. Используйте планировщик quartz.

2. Рассматривали ли вы возможность реализации этого с помощью триггера вместо этого?

Ответ №1:

Я обнаружил более простой подход, используя cron для установки расписания вместо fixedRate . cron обеспечивает более точный контроль над тем, когда запускать задание, и может быть настроен на запуск поминутного обновления только при открытии фондового рынка США. Например, ниже я начинаю работу в 4:00 утра по восточному времени, чтобы зафиксировать предрыночную торговую активность. Просто добавьте это в a MarketDataScheduler и удалите все остальные классы, которые пытались имитировать точность, обеспечиваемую cron .

     @Scheduled(cron = "0 */1 4-16 * * MON-FRI", zone = "America/New_York")
    public void startSchedule() {

        boolean isMarketOpen = isUSMarketOpen();
        if (isMarketOpen) {
            quoteService.getLatestPrices();
        } else {
            LOGGER.info().log("US stock market is closed. Potential holiday - Closed during normal trading hours");
        }
    }