0

我必须在 kafka 消息中设置自定义标头,我的 kafka 集群本机支持标头(1.xx)。我目前正在使用 springCloudVersion=Finchley.RELEASE。

当我设置属性时

default:
    producer:
      headerMode: none

没有任何标题出现在输出中。

另一方面,如果我正在设置

default:
    producer:
      headerMode: headers

许多标头包括contentTypespring_json_header_types即将出现在标头中,这极大地影响了吞吐量。Kafka 是一种与语言/框架无关的消息传递机制,我觉得 Spring 应该提供一种仅包含用户提供的标头的方法。是否有任何解决方法可以仅将用户设置的标头获取到 kafka 主题,同时抑制所有与 Spring Cloud 相关的标头。

4

1 回答 1

0

我已经在 GitHub 上回答了这个问题。在多个地方问同一个问题是浪费您和我们的时间。正如我在那里所说,Stack Overflow 是提问的首选场所。

这是答案:

请使用 Stack Overflow 提问;GitHub 问题用于报告错误或请求新功能。

您可以在活页夹配置中提供自定义标头映射器。

spring.cloud.stream.kafka.binder.headerMapperBeanName

KafkaHeaderMapper 的 bean 名称,用于将 spring-messaging 标头映射到 Kafka 标头和从 Kafka 标头映射。例如,如果您希望在使用 JSON 反序列化标头的 DefaultKafkaHeaderMapper 中自定义受信任的包,请使用此选项。

默认值:无。

实现您自己的KafkaHeaderMapper并将其添加为 a@Bean并配置活页夹以使用它。

编辑

DefaultKafkaHeaderMapper一个属性可以将byte[]标头转换为String.

/**
 * Set the headers to not perform any conversion on (except {@code String} to
 * {@code byte[]} for outbound). Inbound headers that match will be mapped as
 * {@code byte[]} unless the corresponding boolean in the map value is true,
 * in which case it will be mapped as a String.
 * @param rawMappedHeaders the header names to not convert and
 * @since 2.2.5
 * @see #setCharset(Charset)
 * @see #setMapAllStringsOut(boolean)
 */
public void setRawMappedHeaders(Map<String, Boolean> rawMappedHeaders) {
于 2019-10-29T21:32:52.977 回答