Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将默认容器工厂bean从kafkaListenerContainerFactory更改为我的自定义容器工厂_Java_Spring_Spring Boot_Spring Kafka - Fatal编程技术网

Java 将默认容器工厂bean从kafkaListenerContainerFactory更改为我的自定义容器工厂

Java 将默认容器工厂bean从kafkaListenerContainerFactory更改为我的自定义容器工厂,java,spring,spring-boot,spring-kafka,Java,Spring,Spring Boot,Spring Kafka,在SpringKafka文档中,我们可以看到默认容器工厂被假定为可用,bean名称为kafkaListenerContainerFactory,除非通过配置提供了明确的默认值 我想询问是否可以更改配置以使用我的自定义容器工厂bean(例如,CustomKafkAlisterContainerFactory)而不是KafkAlisterContainerFactory 代码示例->如果我们键入 @KafkaListener(id = "cat", topics = "myTopic") publi

在SpringKafka文档中,我们可以看到默认容器工厂被假定为可用,bean名称为
kafkaListenerContainerFactory
,除非通过配置提供了明确的默认值

我想询问是否可以更改配置以使用我的自定义容器工厂bean(例如,
CustomKafkAlisterContainerFactory
)而不是
KafkAlisterContainerFactory

代码示例->如果我们键入

@KafkaListener(id = "cat", topics = "myTopic")
public void listen(String data, Acknowledgment ack) {
    ...
    ack.acknowledge();
}
然后默认的ContainerFactorybean是
CustomKafkAlisterContainerFactory
而不是
KafkAlisterContainerFactory

更准确地说->如果我没有提供任何containerFactory属性,那么就使用
customKafkaListenerContainerFactory
而不是
kafkaListenerContainerFactory
是的,您可以通过使用
@KafkaListener
注释中的属性来设置自定义kafka容器工厂bean

KafkaListenerContainerFactory的bean名称,用于创建负责服务于此端点的消息侦听器容器

也可以在Config类中重写默认值。正如@Gary Russell所说的,只使用相同的bean名称,它将替换Boot的名称,这取决于是否存在具有该名称的bean

@Configuration
@EnableKafka
public class Config {

   @Bean
   @ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")
   ConcurrentKafkaListenerContainerFactory<Integer, String>
                    kafkaListenerContainerFactory(ConcurrentKafkaListenerContainerFactoryConfigurer configurer) {
    ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
                            new ConcurrentKafkaListenerContainerFactory<>();
    configurer.configure(factory,consumerFactory());
    // set custom properties
    return factory;
   }

   @Bean
   public ConsumerFactory<Integer, String> consumerFactory() {
      return new DefaultKafkaConsumerFactory<>(consumerConfigs());
   }

   @Bean
   public Map<String, Object> consumerConfigs() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, embeddedKafka.getBrokersAsString());
    ...
    return props;
  }
}
@配置
@使能卡夫卡
公共类配置{
@豆子
@ConditionalOnMissingBean(name=“kafkaListenerContainerFactory”)
ConcurrentKafkaListenerContainerFactory
kafkaListenerContainerFactory(ConcurrentKafkaListenerContainerFactoryConfigurer配置器){
ConcurrentKafkalistener集装箱工厂=
新的ConcurrentKafkaListenerContainerFactory();
configure(工厂,consumerFactory());
//设置自定义属性
返回工厂;
}
@豆子
公共消费者工厂消费者工厂(){
返回新的DefaultKafkanConsumerFactory(consumerConfigs());
}
@豆子
公共地图使用者配置(){
Map props=newhashmap();
put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,embeddedKafka.getBrokersassString());
...
返回道具;
}
}

我不想使用
containerFactory
属性。我只想将默认的KafkListenerContainerFactory更改为
CustomKafkListenerContainerFactory
。更准确地说->如果我没有提供任何containerFactory属性,那么就使用
CustomKafkalListenerContainerFactory
而不是
KafkalListenerContainerFactory
您可以在config类@SymaJust中重写使用相同的bean名称;它将替换启动,该启动取决于是否存在名为
@conditionalnmissingbean(name=“kafkaListenerContainerFactory”)的bean并发kafkaListenerContainerFactory kafkaListenerContainerFactory(…)
。除非特别设置,否则注释总是查找
KafkAlisterContainerFactory
。@Deadpool-最好在自定义bean定义中使用
ConcurrentKafkAlisterContainerFactoryConfigurer
,以便您可以应用启动配置属性,然后设置其他属性。谢谢@GaryRussell为我指明了正确的方向,让我更新答案
@Configuration
@EnableKafka
public class Config {

   @Bean
   @ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")
   ConcurrentKafkaListenerContainerFactory<Integer, String>
                    kafkaListenerContainerFactory(ConcurrentKafkaListenerContainerFactoryConfigurer configurer) {
    ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
                            new ConcurrentKafkaListenerContainerFactory<>();
    configurer.configure(factory,consumerFactory());
    // set custom properties
    return factory;
   }

   @Bean
   public ConsumerFactory<Integer, String> consumerFactory() {
      return new DefaultKafkaConsumerFactory<>(consumerConfigs());
   }

   @Bean
   public Map<String, Object> consumerConfigs() {
    Map<String, Object> props = new HashMap<>();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, embeddedKafka.getBrokersAsString());
    ...
    return props;
  }
}