Spring boot 有没有办法在SpringKafka中配置自定义RecordMessageConverter?
我创建了一个自定义的Spring boot 有没有办法在SpringKafka中配置自定义RecordMessageConverter?,spring-boot,apache-kafka,spring-kafka,Spring Boot,Apache Kafka,Spring Kafka,我创建了一个自定义的RecordMessageConverter,它在toMessage和fromMessage中打印(我创建了Bean,如中所述),但不幸的是,它没有绑定到侦听器。我可以显式地绑定它吗?还是应该做一些其他事情使它工作? public class MobileMessageConverter implements RecordMessageConverter { @Override public Message<?> toMessage(Consume
RecordMessageConverter
,它在toMessage
和fromMessage
中打印(我创建了Bean,如中所述),但不幸的是,它没有绑定到侦听器。我可以显式地绑定它吗?还是应该做一些其他事情使它工作?public class MobileMessageConverter implements RecordMessageConverter {
@Override
public Message<?> toMessage(ConsumerRecord<?,?> record, Acknowledgment acknowledgment, Consumer<?, ?> consumer, Type payloadType) {
System.out.println("Converting toMessage");
return null;
}
@Override
public ProducerRecord<CustomKey, CustomValue> fromMessage(Message<?> message, String defaultTopic) {
System.out.println("Converting fromMessage");
return new ProducerRecord("UNKNOWN",new CustomValue());
}
}
@RestController
public class CustomKafkaController {
@Bean
public RecordMessageConverter converter() {
return new CustomMessageConverter();
}
@KafkaListener(topics = "UNKNOWN", containerFactory = "kafkaListenerContainerFactory", groupId = "1")
public void listenAsObject(ConsumerRecord<CustomKey, CustomValue> cr) {
System.out.println(cr.getValue().getCustomMessage());
}
}
公共类MobileMessageConverter实现RecordMessageConverter{
@凌驾
公共消息到消息(消费者记录记录、确认、消费者、类型payloadType){
System.out.println(“转换为消息”);
返回null;
}
@凌驾
来自消息的公共产品记录(消息消息,字符串默认主题){
System.out.println(“从消息转换”);
返回新的产品记录(“未知”,新的CustomValue());
}
}
@RestController
公共类CustomKafkanController{
@豆子
public RecordMessageConverter转换器(){
返回新的CustomMessageConverter();
}
@KafkaListener(topics=“未知”,containerFactory=“kafkaListenerContainerFactory”,groupId=“1”)
public void listenAsObject(ConsumerRecord cr){
System.out.println(cr.getValue().getCustomMessage());
}
}
我解决了
kafkaListenerContainerFactory
)MessagingMessageConverter
而不是RecordMessageConverter
,并实现了方法extractAndConvertValue
列表对象
,并将其替换为转换为如果要将自定义值更改为字符串:
创建新转换器:
public class CustomToStringMessageConverter extends MessagingMessageConverter {
@Override
protected String extractAndConvertValue(ConsumerRecord<?, ?> record, Type type){
return "EmptyString"
}
}
最后一件事是获取转换后的Bean并在工厂中设置:factory.setMessageConverter(new CustomToStringMessageConverter ());
确切的问题是什么?您是否收到任何异常?不,我没有收到异常,侦听器收到消息,但它没有打印
到消息
和到消息
的字符串,可能您的@Bean converter()
不可见,因为您在@RestController
中声明了它。考虑在一些<代码> @配置< /Cord>类中使用它。您已经实现了<代码> RecordMessageConverter < /C> >,它将将有效载荷转换为某种类型,因此需要完成实现而不是返回null。那么@KafkaListener方法为什么要尝试消费ConsumerRecord
?您的消息转换器将有效负载转换为某种类型。你到底想在这里做什么?我想得到一些类型并转换成另一种类型。在这里,我只是打印看看它是否有效。
factory.setMessageConverter(new CustomToStringMessageConverter ());