来自kinesis的消息中的Spring cloud stream Special Chars

时间:2018-03-14 17:41:58

标签: spring-integration spring-cloud spring-cloud-stream spring-integration-aws

当我从kinesis流中消费消息时。我得到一些带标题的垃圾字符

    @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"));
    }

Aplication yml

spring:
  cloud:
    stream:
      bindings:
        input: 
          group: abcd
          destination: stream
          content-type: application/json
          errorChannelEnabled: true
          consumer:
            headerMode: raw

我在侦听器和带有垃圾字符的错误信道中输出

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

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

1 个答案:

答案 0 :(得分:2)

AWS Kinesis不提供任何标头实体。因此,为了在Spring Cloud Stream中利用这样的功能,我们标头嵌入到Kinesis记录的主体中。为此,Kinesis Binder默认headerModeembeddedHeaders。对于生产者和消费者之间的对称性,不得更改此选项。

框架为目标EmbeddedHeadersChannelInterceptor频道提供了现成的@StreamListener,并且已提取嵌入的标头并将其正确填充到要发送的邮件中。

当我们处理errorChannel中的错误时,我们确实有一个errorMessage.getOriginalMessage()作为非转换的 - 原始的。因此,该邮件的payload是包含嵌入标题的记录正文中的byte[]

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

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