#spring-boot #apache-kafka-streams #spring-kafka
#spring-загрузка #apache-kafka-streams #spring-kafka
Вопрос:
Используя spring-boot-2.1.3, spring-kafka-2.2.4, я хочу иметь две конфигурации потоков (например, иметь разные application.id или подключиться к другому кластеру и т.д.). Итак, я определил конфигурацию первого потока в значительной степени в соответствии с документами, затем добавил второй, с другим именем, и второй StreamsBuilderFactoryBean (также с другим именем):
@Bean(name = KafkaStreamsDefaultConfiguration.DEFAULT_STREAMS_CONFIG_BEAN_NAME)
public KafkaStreamsConfiguration kStreamsConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "myappId1000");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
//...
return new KafkaStreamsConfiguration(props);
}
@Bean(name = "myKappConfig")
public KafkaStreamsConfiguration myKafkaAppIdConfiguration() {
Map<String, Object> props = new HashMap<>();
props.put(StreamsConfig.APPLICATION_ID_CONFIG, "myappId9999");
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
//...
return new KafkaStreamsConfiguration(props);
}
@Bean(name = "myKappConfigStreamBuilder")
public StreamsBuilderFactoryBean myAppStreamBuilder(
@Qualifier("myKappConfig") KafkaStreamsConfiguration myKafkaAppIdConfiguration) {
return new StreamsBuilderFactoryBean(myKafkaAppIdConfiguration);
}
Однако, когда я пытаюсь запустить приложение, я получаю:
Параметр 0 метода kafkaStreamsFactoryBeanConfigurer в org.springframework.boot.autoconfigure.kafka.Для KafkaStreamsAnnotationDrivenConfiguration требовался один компонент, но были найдены 2: — amp;defaultKafkaStreamsBuilder: определяется методом ‘defaultKafkaStreamsBuilder’ в пути к классу resource [org/springframework/kafka/annotation/KafkaStreamsDefaultConfiguration.class ] — amp;myKappConfigStreamBuilder: определяется методом ‘myAppStreamBuilder’ в ресурсе пути к классу [com/teramedica/kafakaex001web/KafkaConfig.class ]
поскольку код в автоконфигурации spring-boot выполняет:
@Bean
public KafkaStreamsFactoryBeanConfigurer kafkaStreamsFactoryBeanConfigurer(
StreamsBuilderFactoryBean factoryBean) {
return new KafkaStreamsFactoryBeanConfigurer(this.properties, factoryBean);
}
За исключением полной замены KafkaStreamsAnnotationDrivenConfiguration, как мне определить более одного StreamsBuilderFactoryBean. Или, в качестве альтернативы, как я могу изменить свойства для данного потока?
Комментарии:
1. как я вижу, вы настроили свой собственный
StreamsBuilderFactoryBean
, и один был автоматически настроен внутриKafkaStreamsDefaultConfiguration
. в случае, если вам нужно определить два построителя потоков самостоятельно, возможно, вам не нужен компонент из autoconfiguration? поэтому просто исключите такую автоматическую настройку или удалите@EnableKafkaStreams
2. Вам просто нужно пометить один как
@Primary
; загрузка, вероятно, должна быть немного более мягкой.3. Тот, который должен быть помечен как @Primary, определен в KafkaStreamsDefaultConfiguration и является кодом spring, а не моим, поэтому я не могу пометить его (по крайней мере, не аннотацией к самому классу). С другой стороны, StreamsBuilderFactoryBean, используемый в в KafkaStreamsAnnotationDrivenConfiguration#kafkaStreamsFactoryBeanConfigurer, может быть квалифицирован. Но опять же, не мой код. Я мог бы удалить EnableKafkaStreams, но тогда я дублирую существующий код, когда я действительно просто хочу добавить. Похоже, я должен быть в состоянии определить более одной конфигурации, не начиная с нуля.
4. Извините — я не получаю уведомления о комментариях к вашему вопросу, только мой ответ, поэтому я этого не видел. Смотрите мой ответ там; Я согласен, что загрузка не должна прерываться в этой ситуации.
Ответ №1:
Пометьте один заводской компонент @Primary
.
Комментарии:
1. Есть ли способ пометить компонент
@Primary
, который определен в существующем коде? Я бы хотел отметить KafkaStreamsDefaultConfiguration. По умолчанию Kafkastreamsbuilder (spring code) является основным. Хотя, я думаю, я мог бы по существу дублировать то, что это делает, пометить это как основное, а затем добавить другое. Тогда исходный компонент просто не использовался бы, что немного неудобно. Мне интересно, может быть, в конце концов, было бы чище отключить автоматическую настройку и сделать это самому, как предложил @VasiliySarzhynskyi.2. Вам нужно было бы переопределить их компонент.
>bean would just be unused
нет, это вообще не присутствовало бы, оно было бы заменено вашим определением компонента. Я предлагаю вам открыть проблему при загрузке, чтобы попросить их более элегантно обработать ваш вариант использования.3. > Вам нужно было бы переопределить их компонент. > компонент просто не использовался бы, нет, он вообще не присутствовал бы, он был бы заменен вашим определением компонента. Мне также нужно было бы удалить
EnableKafkaStreams
, поскольку там нет условия. Но я вижу, что это единственный компонент там, в любом случае,4. Просто столкнулся с той же проблемой и попытался исключить KafkaStreamsAnnotationDrivenConfiguration, но не удалось с ‘Следующие классы не могут быть исключены, поскольку они не являются классами автоматической настройки: — org.springframework.boot.autoconfigure.kafka. KafkaStreamsAnnotationDrivenConfiguration’ ожидается ли это? Конфигурация KafkaStreamsAnnotationDrivenConfiguration относится к области пакета.
5. Не задавайте новых вопросов в комментариях; если исключение не работает, это может быть ошибка при загрузке; задайте новый вопрос с более подробной информацией или, если вы считаете, что это ошибка, откройте проблему при загрузке.