Spring Boot Kafka Несколько потребителей с разной конфигурацией свойств с помощью appication.yml/properties

#spring #spring-boot #apache-kafka #spring-kafka

#spring #spring-boot #apache-kafka #spring-kafka

Вопрос:

Я видел примеры, когда у нас есть класс конфигурации java, и мы определяем несколько KafkaListenerContainer и передаем требуемое containerType @kafkaListener . Но я изучаю, есть ли какие-либо способы добиться того же, используя автоматическую настройку Spring Boot Kafka через appication.yml/properties.

Ответ №1:

Нет; Загрузка будет автоматически настраивать только один набор инфраструктуры; если вам нужно несколько, вам нужно определить их как компоненты.

Однако в последних версиях (начиная с 2.3.4) вы можете добавить средство настройки контейнера прослушивателя на фабрику, чтобы вы могли настраивать каждый контейнер прослушивателя, даже если они созданы одной фабрикой; некоторые свойства также могут быть переопределены в самой @KafkaListener аннотации.

Пример:

 @Component
class Customizer {

    public Customizer(ConcurrentKafkaListenerContainerFactory<?, ?> factory) {
        factory.setContainerCustomizer(container -> {
            if (container.getContainerProperties().getGroupId().equals("slowGroup")) {
                container.getContainerProperties().setIdleBetweenPolls(60_000);
            }
        });
    }

}
  

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

1. Я определил spring.kafka.listener.type=batch в своем application.properties и попытался переопределить как @KafkaListener(properties="spring.kafka.listener.type:single" ). Но это не работает, и я все еще получаю записи kafka в пакетах. Какие-либо входные данные, например, где я ошибаюсь? @GaryRussell

2. Нет; эти свойства Kafka Consumer Properties только. К сожалению, тип прослушивателя (пакетный против. Single) — это не то, что вы можете переопределить; потому что это определяет тип KafkaListener создаваемого объекта; это не свойство прослушивателя или контейнера, оно определяет полный тип прослушивателя, который создает фабрика. Для этого свойства вам все еще нужны две фабрики. Я посмотрю, смогу ли я придумать обходной путь, но пока вам нужно 2 фабрики.