Spring integration 从kinesis收到的消息中的Spring cloud stream特殊字符

Spring integration 从kinesis收到的消息中的Spring cloud stream特殊字符,spring-integration,spring-cloud,spring-cloud-stream,spring-integration-aws,Spring Integration,Spring Cloud,Spring Cloud Stream,Spring Integration Aws,当我使用来自动觉流的消息时。我买了一些带标题的垃圾车 @StreamListener(Processor.INPUT) public void receive(String message) { System.out.println("Message recieved: "+message); throw new RuntimeException("Exception thrown"); } @StreamListe

当我使用来自动觉流的消息时。我买了一些带标题的垃圾车

    @StreamListener(Processor.INPUT)
    public void receive(String message) {       
        System.out.println("Message recieved: "+message);
        throw new RuntimeException("Exception thrown");
    }

    @StreamListener("errorChannel")
    public void transform(ErrorMessage errorMessage) throws UnsupportedEncodingException {      

        //original paylaod 
        System.out.println("Error Oiginal Message Payload"+new String((byte[])errorMessage.getOriginalMessage().getPayload(), "UTF-8"));
        System.out.println("Error Original Message Stream channel"+errorMessage.getOriginalMessage().getHeaders().get("aws_receivedStream"));
    }
应用yml

spring:
  cloud:
    stream:
      bindings:
        input: 
          group: abcd
          destination: stream
          content-type: application/json
          errorChannelEnabled: true
          consumer:
            headerMode: raw
我在listener和errorChannel中同时获得带有垃圾字符的输出

我试图在errorChannel中提取原始消息。这是转换字节消息的正确方法吗

Message recieved: ?contentType "application/json"{"aa":"cc"}

AWS Kinesis不提供任何标题实体。因此,为了在SpringCloudStream中利用这样的功能,我们将头嵌入到Kinesis记录的主体中。为此,默认情况下,Kinesis活页夹中的
headerMode
embeddedHeaders
。对于生产者和消费者之间的对称性,此选项不得更改

该框架为目标
@StreamListener
通道提供现成的
EmbeddedHeadersChannelInterceptor
,并正确提取和填充嵌入式头以发送消息

当我们在
errorChannel
中处理错误时,我们确实有一个
errorMessage.getOriginalMessage()
为非转换原始。因此,该消息的
有效载荷
是来自包含嵌入头的记录体的
字节[]

如果您想正确地解析它们。您应该使用以下实用程序:

EmbeddedHeaderUtils.extractHeaders((Message<byte[]>) message, true);
EmbeddedHeaderUtils.extractHeaders((Message)Message,true);

您还需要制作方的
headerMode:raw
;或
headerMode:embedded
,位于使用者端,以便将标题剥离。@GaryRussel谢谢。我认为消费者端的默认头模式是嵌入的。“我也试过了。”加里鲁塞尔说。在流侦听器中,我得到了正确的消息。但是在ErrorChannel中,我得到了带有内容类型和特殊字符的消息。我喜欢这个新字符串((byte[])errorMessage.getOriginalMessage().getPayload(),“UTF-8”)你能帮忙吗。在这种情况下,你需要在
originalMessage上使用
MessageHeaderUtils.extractHeaders()
。看看我的答案。我想知道我们是否应该在发送到下游之前,在活页夹级别进行嵌入式标题提取。当
errorChannel
上的
originalMessage
已被转换时,实现这种方式。@artem bilan有没有办法使用spring integration将标题添加到正文中?我的意思是,如果我在我的事件主体中手动添加标题映射到kinesis,那么使用
EmbeddedHeaderUtils.extractHeaders
仍将提取标题?请提出一个新问题,并提供更多详细信息。所以这不是聊天。