当有多种不同类型的消息要发送时,建议使用什么方法定义KafkaTemplate
?对所有消息只使用一个KafkaTemplate
(使用Object
),还是对每种类型的消息定义每个KafkaTemplate
?
一个模板KafkaTemplate
和Object
:
// 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()));
}
2条答案
按热度按时间nbnkbykc1#
KafakTemplate
上的泛型类型实际上只对receive()
操作重要。<Object, Object>
在大多数情况下都可以(即不使用receive)。但是,Sping Boot 会自动配置一个带有
<?, ?>
的模板,这允许你在多个地方注入你想要的泛型。生产者和消费者工厂也是如此。
baubqpgj2#
我认为这可能会帮助你做出决定。你应该使用一个通用的KafkaTemplate〈String,Object〉,即使生产者在多个主题上发布不同类型的值/数据。
这类似于在应用程序中为数据库保留一个JdbcTemplate,而不依赖于表。对于一个数据库,我们保留一个JdbcTemplate,直到应用程序连接到多个数据库。