Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 有没有办法在SpringKafka中配置自定义RecordMessageConverter?_Spring Boot_Apache Kafka_Spring Kafka - Fatal编程技术网

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());
}
}
我解决了

  • 我通过其setter将转换器添加到工厂Bean(
    kafkaListenerContainerFactory
  • 我将convert改为implement
    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 ());