在springboot中配置两个kafka环境

在工作中需要实了这么一个功能,把从正式环境kafka的数据消费出来,然后转发到测试环境kafka。

原理不复杂,只不过一般很少会配两个kafka环境。

特此记录下,以后说不定可以复用。

因为我们在配置文件里一般会有一个默认的kafka,这个配置我们不动,用来消费数据。

同时我们在配置一个测试环境kafka,命令需要区分下,比如叫kafka-test

server:
  port: "${SERVER_PORT:8080}"


spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  application:
    name: {server-name}
  kafka:
       //...旧的kafka配置不变,下面新增一个kafka
  kafka-test:
    bootstrap-servers: "${KAFKA_SERVERS_TEST:kafka:9092}"
    consumer:
      group-id: kafka-forward
      enable-auto-commit: true
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    listener:
      concurrency: "${KAFKA_CONCURRENCY:1}"

然后定义一个配置类,将测试环境kafka构建成bean对象,因为我们只需要发送消息,所以可以不配消费的参数

@EnableKafka
@Configuration
public class KafkaTestConfig {

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


    @Bean
    public Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, producerBootstrapServers);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        return props;
    }

    @Bean
    public ProducerFactory<String, String> producerFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    /**
     * 自定义的测试环境kafka-template
     *
     * @return
     */
    @Bean(name = "kafkaTemplateTest")
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }

}

这个时候我们的环境中会有两个kafkaTemplate,所以引用的时候需要指定名称,如下

@Autowired
    @Qualifier("kafkaTemplateTest")
    private KafkaTemplate<String, String> kafkaTemplate;

这样就成功了!

一次性搞定,记录一下!

posted @ 2022-11-22 11:12  Mars.wang  阅读(1838)  评论(0编辑  收藏  举报