用自定义工厂实现替换 micronaut 的默认 KafkaProducerFactory

Replacing micronaut's default KafkaProducerFactory with custom factory implementation

我需要自定义随 micronaut-kafka 依赖项一起提供的默认 KafkaProducerFactory(或任何其他默认工厂,例如 KafkaConsumerFactory)。为此,我尝试使用

替换现有工厂
@Factory
@Replaces(factory = KafkaProducerFactory.class)
class CustomFactory extends KafkaProducerFactory {
  
  @Bean
  @Any
  public <K, V> Producer<K, V> getProducer(
        @Nullable InjectionPoint<KafkaProducer<K, V>> injectionPoint,
        @Nullable @Parameter AbstractKafkaProducerConfiguration<K, V> producerConfiguration) {

     validate(producerConfiguration); //this is my primary intension
     super.getProducer(injectionPoint, producerConfiguration);
  }
}

但似乎 Micronaut 无法替换 KafkaProducerFactory 因此两个工厂都存在并且我收到错误提示

"multiple candidate bean exists [CustomFactory, KafkaProducerFactory]"

我还想在应用程序加载时排除 KafkaProducerFactory,但在 Micronaut 中找不到与 Spring 的 ComponentScan.excludeFilter 类似的东西。

我的配置有什么问题吗?或者有其他方法可以实现吗?

终于找到答案了。让我根据实际情况再详细说明一下,

问题

我们有创建 producer/consumer 实例的自定义方法,即自定义 class 创建给定配置属性的实例。现在我必须修改默认工厂,这样工厂就不会自己创建实例,而是应该调用我们的自定义 class 来实例化 producer/consumers.

解决方案

我必须添加 @Primary 以及其他注释及其工作方式,

@Factory
@Replaces(factory = KafkaProducerFactory.class)
@Primary
class CustomFactory extends KafkaProducerFactory {
   //code here
}

但是我实现这个的方法有点变通,因为

我的主要意图是覆盖子 class 中默认工厂的 producer/consumer 创建部分,然后用子 class 替换默认工厂。但是根据默认工厂 class 中的代码结构,它不是一个我们可以插入自定义代码的地方(没有特定的 public 方法来合并创建 producer/consumer 的代码,它是从 3 个不同的地方创建的,带有“new”)以创建生产者。 因此我们不得不复制整个默认工厂 class 并用自定义代码替换 3 个地方 这似乎不是正确的方法。