Java Spring Kafka为多个主题提供单一制作人
我想使用一个生产者将JSON对象写入多个主题 下面的代码正在执行我想要的操作,但是使用Java Spring Kafka为多个主题提供单一制作人,java,spring,spring-kafka,Java,Spring,Spring Kafka,我想使用一个生产者将JSON对象写入多个主题 下面的代码正在执行我想要的操作,但是使用setDefaultTopic()方法告诉KafkaTemplate它应该将消息发送到哪个主题会让人感觉不对 如果使用send(字符串主题,?有效负载)方法,则StringJsonMessageConverter将无法工作 我的制作人: public class MyProducer { @Autowired private KafkaTemplate<String, ?> kaf
setDefaultTopic()
方法告诉KafkaTemplate
它应该将消息发送到哪个主题会让人感觉不对
如果使用send(字符串主题,?有效负载)
方法,则StringJsonMessageConverter
将无法工作
我的制作人:
public class MyProducer {
@Autowired
private KafkaTemplate<String, ?> kafka;
public void send(String topic, Message<?> message) {
kafka.setDefaultTopic(topic);
kafka.send(message);
}
}
公共类MyProducer{
@自动连线
私人卡夫卡-卡夫卡;
公共void发送(字符串主题、消息){
卡夫卡.setDefaultTopic(主题);
卡夫卡。发送(消息);
}
}
和我的配置:
@Configuration
public class MyProducerConfig {
@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> props = new HashMap<>();
...
return new DefaultKafkaProducerFactory<>(props);
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate(ProducerFactory<String, String> producerFactory) {
KafkaTemplate<String, String> kafkaTemplate = new KafkaTemplate<>(producerFactory);
kafkaTemplate.setMessageConverter(new StringJsonMessageConverter());
return kafkaTemplate;
}
}
@配置
公共类MyProducerConfig{
@豆子
公共生产工厂生产工厂(){
Map props=newhashmap();
...
返回新的DefaultKafkaProducerFactory(道具);
}
@豆子
公共卡夫卡模板卡夫卡模板(ProducerFactory ProducerFactory){
KafkaTemplate KafkaTemplate=新的KafkaTemplate(生产工厂);
setMessageConverter(新的StringJsonMessageConverter());
返回卡夫卡模板;
}
}
关于如何正确地做到这一点,有什么建议吗
更新
我把代码改成这个
制作人:
public class MyProducer {
@Autowired
private KafkaTemplate<String, ?> kafka;
public void send(String topic, Message<?> message) {
kafka.setDefaultTopic(topic);
kafka.send(message);
}
}
public void send(Message<?> message) {
kafka.send(message);
}
public void发送(消息){
卡夫卡。发送(消息);
}
在我的控制器中(我在其中创建消息对象)
MessageHeaders=newmessageheaders(Collections.singletonMap(KafkaHeaders.TOPIC,“topicName”);
GenericMessage GenericMessage=新的GenericMessage(有效负载、标头);
producer.send(genericMessage);
MessageHeaders对象仍将包含id和时间戳。在调用模板之前,必须手动使用
StringJsonMessageConverter
:
ProducerRecord<?, ?> producerRecord = kafka.getMessageConverter().fromMessage(message, topic);
kafka.send(producerRecord);
ProducerRecord ProducerRecord=kafka.getMessageConverter().fromMessage(消息,主题);
卡夫卡·森德(生产记录);
使用发送(消息)
变量时,消息转换器希望主题位于消息头中
String topic = headers.get(KafkaHeaders.TOPIC, String.class);
如果可以通过其他方式确定主题,则需要创建自定义转换器
更改默认主题不是线程安全的。由模板内部执行;看看我的答案,它在起作用。非常感谢。我不知道
KafkaHeaders
类,而MessageHeaders
类没有为主题提供静态字段。@GaryRussell我可以将其用于不同的值序列化程序吗?通常最好问一个新问题,而不是对2年前的答案进行评论。我不知道你在问什么,但是最近的2.3版本允许在同一个生产者中使用不同的序列化程序,基于消息头。如果这不是你要问的,请问一个新问题。