不使用@Kafkalistener

时间:2018-07-13 10:45:25

标签: spring-boot apache-kafka kafka-consumer-api spring-kafka

我试图不使用@Kafkalistener来编写kafka使用者,下面是我用于配置侦听器的代码行:

@Configuration
    @EnableKafka
    public class KafkaConfig {

      @Value("${kafka.bootstrap-servers}")
      private String bootstrapServers;

      @Bean
      public Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        // list of host:port pairs used for establishing the initial connections to the Kafka cluster
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
            bootstrapServers);
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
            StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
            StringDeserializer.class);
        // allows a pool of processes to divide the work of consuming and processing records
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "org");
        // automatically reset the offset to the earliest offset
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");

        return props;
      }

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

      @Bean
      public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
          ContainerProperties containerProperties=new ContainerProperties("in.t");
        ConcurrentKafkaListenerContainerFactory<String, String> factory =
            new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());

        return factory;
      }

      @Bean
      public Consumer receiver() {
        return new Consumer();
      }
    }

在这里,我该如何配置主题和侦听器方法,并且我的使用者类可以有多个方法。

还想知道将@kafkalistener与kafka流一起使用时是否遇到任何潜在问题。

PS:我不想使用@KafkaListener。

1 个答案:

答案 0 :(得分:2)

  1. @kafkalistener不适用于Kafka Streams。它用于纯Consumer。可以通过StreamsBuilderFactoryBean@Bean的特定KStream来管理Kafka流。

  2. 如果您不想使用@kafkalistener,则需要指导手动创建KafkaListenerContainerKafkaListenerContainerFactory可以用于此目的,但仅由于Spring Kafka 2.2而已,而且绝对不能使用Spring Boot。

因此,除非您手动创建ConcurrentMessageListenerContainer,否则您别无选择。通过ContainerProperties,您可以在此处注入目标messageListener。对于自定义Consumer POJO,您需要考虑将其包装到RecordMessagingMessageListenerAdapter中。并且只需将最后一个注入ConcurrentMessageListenerContainer中。

这就是@KafkaListener底下的工作方式。