У меня есть 2 слушателя Kafka ежедневно / еженедельно. Ежедневно имеет autoStartup = true, а Weekly - autoStartup = false. У меня есть конечная точка, чтобы остановить ежедневный запуск и начать еженедельно. После того, как еженедельно закончил прием сообщений, я жду запуска события простоя (установленного на 1 минуту), где останавливаю еженедельно. Теперь я слушаю событие STOP на Weekly, где я начинаю Daily. Проблема в том, что у меня для параллелизма установлено значение 6. Таким образом, я получаю 6 событий простоя и 6 событий остановки. Я поступил так, как показано ниже. Я хотел бы знать, хорошая ли это практика или есть что-нибудь получше?
Я собираю все события остановки Daily в ConcurrentHashMap. Когда он достигает счетчика параллелизма, это означает, что все 6 потоков ежедневного прослушивателя останавливаются и могут запускать еженедельный прослушиватель.
private void processDailyStopEvent(ConsumerStoppedEvent event)
{
LOGGER.info("Processing DAILY Stop events");
KafkaMessageListenerContainer source = (KafkaMessageListenerContainer) event.getSource();
ConcurrentMessageListenerContainer container = (ConcurrentMessageListenerContainer) event.getContainer(ConcurrentMessageListenerContainer.class);
eventMap.get(“dailyStop”).add(source.getListenerId());
LOGGER.info("Added ListenerId {} to Map<dailyStop>", source.getListenerId());
if (eventMap.get(“dailyStop”).size() == container.getConcurrency()) {
LOGGER.info("All DAILY Stop events are captured. Clearing the Map<dailyStop>");
eventMap.get(“dailyStop”).clear();
LOGGER.info("Starting WEEKLY Consumer now.");
kafkaService.startWeeklyConsumer();
}
}
1 ответ
У вас есть разумный подход.
В качестве альтернативы вы можете просто дождаться события остановки параллельного контейнера (где источник равен контейнеру) - оно публикуется после остановки всех дочерних контейнеров.
Похожие вопросы
Новые вопросы
spring-kafka
Проект Spring for Apache Kafka (spring-kafka) применяет основные концепции Spring для разработки решений для обмена сообщениями на основе Kafka.