繁体   English   中英

有没有办法在 spring-kafka 中配置自定义 RecordMessageConverter?

[英]Is there a way to configure custom RecordMessageConverter in spring-kafka?

我创建了一个自定义RecordMessageConverter ,它在toMessagefromMessage中打印(我创建 Bean,如https://www.confluent.io/blog/spring-for-apache-kafka-deep-dive-part-1-error-handling -message-conversion-transaction-support )但不幸的是它没有绑定到监听器。 我可以显式绑定它还是应该做其他事情来使它起作用?

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());
    }
}

我解决它!

  1. 我通过其设置器将转换器添加到工厂 Bean ( kafkaListenerContainerFactory )。
  2. 我更改了转换以实现RecordMessageConverterMessagingMessageConverter并实现了方法extractAndConvertValue
  3. (如果您想更改为其他类型)删除listenAsObject并将其替换为您转换为的ConsumerRecordtype

例如:
如果要将自定义值更改为字符串:
创建新转换器:

public class CustomToStringMessageConverter extends MessagingMessageConverter {
    @Override
    protected String extractAndConvertValue(ConsumerRecord<?, ?> record, Type type){
       return "EmptyString"
    }
}

将侦听器更改为:

@KafkaListener(topics = "UNKNOWN", containerFactory = "kafkaListenerStringContainerFactory", groupId = "1")
public void listen2(String cr) {
    **DO SOMETHING WITH THE CONVERTED CR**
}

最后一件事是通过以下方式获取转换后的 Bean 并将其设置在您的工厂中:

factory.setMessageConverter(new CustomToStringMessageConverter ());

暂无
暂无

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

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