#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");
}
}