在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;
这样就成功了!
一次性搞定,记录一下!
浙公网安备 33010602011771号