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



我需要自定义默认的KafkaProducerFactory(或任何其他默认工厂,比如KafkaConsumerFactory(,该工厂附带micronaut-kafka依赖项。为此,我试图用取代现有的工厂

@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的东西。

我的配置有什么问题吗?或者有其他方法可以做到这一点吗?

最后我得到了答案。让我为实际情况详细说明一下,

问题

我们有创建生产者/消费者实例的自定义方式,即创建给定配置属性的实例的自定义类。现在我不得不修改默认工厂,这样工厂就应该调用我们的自定义类来实例化生产者/消费者,而不是自己创建实例。

解决方案

我不得不添加@Primary以及其他注释和它的工作,

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

但我实现这一目标的方式是一种变通,因为

我的主要意图是覆盖子类中默认工厂的生产者/消费者创建部分,然后用子类替换默认工厂。但根据默认工厂类中的代码结构,它不是一个我们可以插入自定义代码的地方(没有具体的公共方法来整合创建生产者/消费者的代码,它是从3个不同的地方创建的,带有"new"(来创建生产者因此,我们不得不复制整个默认工厂类,并用自定义代码替换了这3个位置,这似乎不是一种正确的方式。

最新更新