当我从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"}
答案 0 :(得分:2)
AWS Kinesis不提供任何标头实体。因此,为了在Spring Cloud Stream中利用这样的功能,我们将标头嵌入到Kinesis记录的主体中。为此,Kinesis Binder默认headerMode
为embeddedHeaders
。对于生产者和消费者之间的对称性,不得更改此选项。
框架为目标EmbeddedHeadersChannelInterceptor
频道提供了现成的@StreamListener
,并且已提取嵌入的标头并将其正确填充到要发送的邮件中。
当我们处理errorChannel
中的错误时,我们确实有一个errorMessage.getOriginalMessage()
作为非转换的 - 原始的。因此,该邮件的payload
是包含嵌入标题的记录正文中的byte[]
。
如果您想正确解析它们。你应该使用实用程序:
EmbeddedHeaderUtils.extractHeaders((Message<byte[]>) message, true);