Apache kafka SpringXD:messages don';当从卡夫卡读取消息时,不包括标题

Apache kafka SpringXD:messages don';当从卡夫卡读取消息时,不包括标题,apache-kafka,spring-integration,spring-xd,Apache Kafka,Spring Integration,Spring Xd,我的结构如下: 卡夫卡主题 我的卡夫卡接收器/源的模块 卡夫卡来源之后的模块。基本上是阅读卡夫卡的消息来源 问题是,当kafka接收器向kafka队列发送事件时,kafka源收到来自kafka主题的消息,然后,下一个模块尝试读取头时,由于找不到头,因此失败 我提出了以下解决方案:将消息头包装在消息中,这样,内部有效负载将包含一个原始有效负载+消息头 我还有什么选择?由于Kafka本机不支持头,您描述的确切机制由Kafka消息总线支持-只是您必须选择要通过总线传输的头名称,以避免传输不需要的头

我的结构如下:

  • 卡夫卡主题
  • 我的卡夫卡接收器/源的模块
  • 卡夫卡来源之后的模块。基本上是阅读卡夫卡的消息来源
问题是,当kafka接收器向kafka队列发送事件时,kafka源收到来自kafka主题的消息,然后,下一个模块尝试读取头时,由于找不到头,因此失败

我提出了以下解决方案:将消息头包装在消息中,这样,内部有效负载将包含一个原始有效负载+消息头


我还有什么选择?

由于Kafka本机不支持头,您描述的确切机制由Kafka消息总线支持-只是您必须选择要通过总线传输的头名称,以避免传输不需要的头

向下滚动至Kafka消息总线属性

messagebus:
 kafka:
  # connection properties
  brokers:                                localhost:9092  (1)
  zkAddress:                              localhost:2181  (2)
  socketBufferSize:                       2097152         (3)
  # operating mode
  mode:                                   embeddedHeaders (4)
  offsetManagement:                       kafkaTopic      
  headers:
  # comma-delimited list of additional header names to transport (6)
  ...
  • 要由总线传输的自定义标头的列表
  • 编辑

    对于rabbit,默认情况下传输所有标头:

        replyHeaderPatterns:       STANDARD_REPLY_HEADERS,*   
        ...
        requestHeaderPatterns:     STANDARD_REQUEST_HEADERS,* 
    
    编辑


    如果您的意思是希望使用相同的技术使用接收器/源从Kafka发送/接收,那么您可以使用XD的支持类来实现这一点-请参阅
    EmbeddedHeadersMessageConverter
    。标题值编码为JSON。

    这意味着我必须更改自去年以来一直使用的数据传输(我们使用的是rabbit)。这听起来不太划算,我是说如果我把数据传输改成卡夫卡。如果我不想更改数据传输,我应该描述更合适的解决方案吗?如果您使用Rabbit作为传输,则传输所有的头(映射到rabbitmq头);只有对于kafka传输,您才需要配置传输哪些头。rabbit传输可以配置为限制标头,但默认情况下,所有标头都被发送。如果您的意思是希望使用相同的技术使用接收器/源从Kafka发送/接收,那么您可以使用XD的支持类来实现这一点-请参阅
    EmbeddedHeadersMessageConverter
    。标题值使用JSON编码。