繁体   English   中英

Spring Kafka单个制作人,可以处理多个主题

[英]Spring Kafka single producer for multiple topics

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

下面的代码正在执行我想要的操作,但是使用setDefaultTopic()方法告诉KafkaTemplate应该将消息发送到哪个主题感觉不对。

如果我使用send(String topic, ? payload)方法,则StringJsonMessageConverter无效。

我的制作人:

public class MyProducer {

    @Autowired
    private KafkaTemplate<String, ?> kafka;

    public void send(String topic, Message<?> message) {
        kafka.setDefaultTopic(topic);
        kafka.send(message);
    }
}

而我的配置:

@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;
    }
}

关于如何正确执行此操作的任何建议?

UPDATE

我将代码更改为此...

制片人:

public void send(Message<?> message) {
    kafka.send(message);
}

在我的控制器中(我在其中创建消息对象);

MessageHeaders headers = new MessageHeaders(Collections.singletonMap(KafkaHeaders.TOPIC, "topicName"));
GenericMessage<NewsRequest> genericMessage = new GenericMessage<>(payload, headers);
producer.send(genericMessage);

MessageHeaders对象仍将包含id和时间戳。

使用send(Message<?>)变体时,消息转换器希望主题位于消息头中。

String topic = headers.get(KafkaHeaders.TOPIC, String.class);

如果可以通过其他方式确定主题,则需要创建一个自定义转换器。

更改默认主题不是线程安全的。

调用模板之前, StringJsonMessageConverter手动使用StringJsonMessageConverter

ProducerRecord<?, ?> producerRecord = kafka.getMessageConverter().fromMessage(message, topic);
kafka.send(producerRecord);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM