创建自定义的DefaultKafkaHeaderMapper

时间:2019-07-04 14:08:59

标签: apache-kafka spring-kafka

当我向kafka主题发送记录时,消费者收到带有一些不必要标题的“ nativeHeaders”(HeaderMethodArgumentResolver甚至无法将其转换为Map)。

我正在寻找重写HeaderMethodArgumentResolver方法“ getNativeHeaders”的方法,以排除该垃圾标头,并且不知道如何向春季提供该子类。

org.springframework.messaging.handler.annotation.support.HeaderMethodArgumentResolver中有一个原始方法:

private Map<String, List<String>> getNativeHeaders(Message<?> message) {
   return (Map)message.getHeaders().get("nativeHeaders");
  }

此呼叫的位置:

message.getHeaders().get("nativeHeaders");

返回以下内容:     https://ibb.co/qrvMNMk (如您所见,除了键值之外,还有一个额外的字段“ headerValue”,这会阻止强制转换)

通过kafkaTemplate发送记录,如下所示:

kafkaTemplate.send(new ProducerRecord<String, TempContractEntity>(topics.getSubmit(), tempContractEntity));

消费者通过@KafkaListener批注获取消息:

@KafkaListener(topics = "#{settingsService.getTopics()}")
public void processMessage(OrchestratorRequestImpl orchestratorRequest,
                           @Header(KafkaHeaders.RECEIVED_TOPIC) String topicName) throws Throwable{//...}

通常我想找到一种预处理kafka标头的方法

1 个答案:

答案 0 :(得分:0)

NonTrustedHeaderType指示带有该标头及其类的消息sent不可信。对于您显示的发送类型,不会发生这种情况-没有Message<?>参与其中,因此问题图片中缺少某些内容。

您可以做的一件事是在使用者配置中添加ConsumerInterceptor,并清除onConsume()方法中不需要的标头。

但是您应该真正弄清楚是谁发送的。