Spring Boot 一个Kafka模板与多个Kafka模板

8yparm6h  于 2022-11-23  发布在  Spring
关注(0)|答案(2)|浏览(264)

当有多种不同类型的消息要发送时,建议使用什么方法定义KafkaTemplate?对所有消息只使用一个KafkaTemplate(使用Object),还是对每种类型的消息定义每个KafkaTemplate
一个模板KafkaTemplateObject

// Object
@Bean
ProducerFactory<String, Object> producerFactory() {
    return new DefaultKafkaProducerFactory<>(producerConfiguration());
}

@Bean
KafkaTemplate<String, Object> kafkaTemplate() {
    return new KafkaTemplate<>(producerFactory());
}

或多个KafkaTemplate

// Address
@Bean
ProducerFactory<String, Address> addressProducerFactory() {
    return new DefaultKafkaProducerFactory<>(producerConfiguration());
}

@Bean
KafkaTemplate<String, Address> addressKafkaTemplate() {
    return new KafkaTemplate<>(addressProducerFactory());
}

// Person
@Bean
ProducerFactory<String, Person> personProducerFactory() {
    return new DefaultKafkaProducerFactory<>(producerConfiguration());
}

@Bean
KafkaTemplate<String, Person> personPafkaTemplate() {
    return new KafkaTemplate<>(personProducerFactory());
}

在后一个例子中,ProducerFactory bean通常也为每种消息类型定义,这会增加额外的代码。我们真的需要它们吗?使用构造函数就可以了,如下所示:

// Address
@Bean
KafkaTemplate<String, Address> addressKafkaTemplate() {
    return new KafkaTemplate<>(new DefaultKafkaProducerFactory<>(producerConfiguration()));
}

// Person
@Bean
KafkaTemplate<String, Person> personPafkaTemplate() {
    return new KafkaTemplate<>(new DefaultKafkaProducerFactory<>(producerConfiguration()));
}
nbnkbykc

nbnkbykc1#

KafakTemplate上的泛型类型实际上只对receive()操作重要。
<Object, Object>在大多数情况下都可以(即不使用receive)。
但是,Sping Boot 会自动配置一个带有<?, ?>的模板,这允许你在多个地方注入你想要的泛型。
生产者和消费者工厂也是如此。

baubqpgj

baubqpgj2#

我认为这可能会帮助你做出决定。你应该使用一个通用的KafkaTemplate〈String,Object〉,即使生产者在多个主题上发布不同类型的值/数据。
这类似于在应用程序中为数据库保留一个JdbcTemplate,而不依赖于表。对于一个数据库,我们保留一个JdbcTemplate,直到应用程序连接到多个数据库。

相关问题