用自定义工厂实现替换 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 个地方 这似乎不是正确的方法。
我需要自定义随 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 个地方 这似乎不是正确的方法。