Java Spring Kafka为多个主题提供单一制作人

Java Spring Kafka为多个主题提供单一制作人,java,spring,spring-kafka,Java,Spring,Spring Kafka,我想使用一个生产者将JSON对象写入多个主题 下面的代码正在执行我想要的操作,但是使用setDefaultTopic()方法告诉KafkaTemplate它应该将消息发送到哪个主题会让人感觉不对 如果使用send(字符串主题,?有效负载)方法,则StringJsonMessageConverter将无法工作 我的制作人: public class MyProducer { @Autowired private KafkaTemplate<String, ?> kaf

我想使用一个生产者将JSON对象写入多个主题

下面的代码正在执行我想要的操作,但是使用
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版本允许在同一个生产者中使用不同的序列化程序,基于消息头。如果这不是你要问的,请问一个新问题。