一个好的做法是在隔离的微服务范围内测试代码时避免向 Kafka 发送消息。但是当您需要进行集成测试(同时进行许多微服务)时,有时您需要激活 Kafka 消息。
所以我的目的是:
1- 根据需要激活/停用 Loding Kafka 配置
@ConditionalOnProperty(prefix = "my.kafka.consumer", value = "enabled", havingValue = "true", matchIfMissing = false)
@Configuration
public class KafkaConsumerConfiguration {
...
}
@ConditionalOnProperty(prefix = "my.kafka.producer", value = "enabled", havingValue = "true", matchIfMissing = false)
@Configuration
public class KafkaProducerConfiguration {
...
}
然后你将能够根据需要激活/停用加载消费者和生产者......
例子 :
@SpringBootApplication
@Import(KafkaConsumerConfiguration.class)
public class MyMicroservice_1 {
public static void main(String[] args) {
SpringApplication.run(MyMicroservice_1.class, args);
}
}
或者
@SpringBootApplication
@Import(KafkaProducerConfiguration.class)
public class MyMicroservice_2 {
public static void main(String[] args) {
SpringApplication.run(MyMicroservice_2.class, args);
}
}
或者可能需要两种配置的微服务
@SpringBootApplication
@Import(value = { KafkaProducerConfiguration.class, KafkaConsumerConfiguration.class })
public class MyMicroservice_3 {
public static void main(String[] args) {
SpringApplication.run(MyMicroservice_3.class, args);
}
}
2 - 您还需要根据当前的弹簧配置文件发送消息。为此,您可以覆盖 Kafka 模板对象的发送方法:
@ConditionalOnProperty(prefix = "my.kafka.producer", value = "enabled", havingValue = "true", matchIfMissing = false)
@Configuration
public class KafkaProducerConfiguration {
...
@Resource
Environment environment;
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory()) {
@Override
protected ListenableFuture<SendResult<String, String>> doSend(ProducerRecord<String, String> producerRecord) {
if (Arrays.asList(environment.getActiveProfiles()).contains("test")) {
return null;
}
return super.doSend(producerRecord);
}
};
}
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> props = new HashMap<>();
...
return new DefaultKafkaProducerFactory<>(props);
}
}