我正在使用Spring Cloud SQS消息来监听指定的队列。因此使用@SqsListener注释如下:
@SqsListener(value = "${QUEUE}", deletionPolicy = SqsMessageDeletionPolicy.ALWAYS )
public void receive(@Headers Map<String, String> header, @Payload String message) {
try {
logger.logInfo("Message payload is: "+message);
logger.logInfo("Header from SQS is: "+header);
if(<Some condition>){
//Dequeue the message once message is processed successfully
awsSQSAsync.deleteMessage(header.get(LOOKUP_DESTINATION), header.get(RECEIPT_HANDLE));
}else{
logger.logInfo("Message with header: " + header + " FAILED to process");
logger.logError(FLEX_TH_SQS001);
}
} catch (Exception e) {
logger.logError(FLEX_TH_SQS001, e);
}
}
我能够成功连接指定的队列并读取消息。我在发送消息之前将消息属性设置为“Key1”=“Value1”以及aws控制台中的消息。以下是邮件正文:
{
"service": "ecsservice"
}
我期待“标题”接收所有消息属性的Map以及一个,即Key1和Value1。但我收到的是:{service = ecsservice}作为填充的地图。
这意味着消息的有效负载/正文将作为标题的一部分出现,尽管正文正确。
我想知道我正在做什么错误,因为哪个@Header标头没有获得正确的消息属性。
寻求专家意见。
-PC
我在一个相当大的代码库中解决了这个问题。事实证明,HandlerMethodArgumentResolver被添加到解析器列表中,用于将消息基本解析为参数。就我而言,它是PayloadArgumentResolver,无论注释如何,它通常总是将参数解析为有效负载。它似乎默认情况下它应该在列表中排在最后,但由于我不知道的代码,它最终被添加到前面。
无论如何,如果你不确定看看你的代码,看看你是否正在做关于spring的QueueMessageHandler或HandlerMethodArgumentResolver的任何事情。
它帮助我使用调试器并查看HandlerMethodArgumentResolver.resolveArgument方法来开始跟踪发生的事情。
附:我认为你的@SqsListener代码看起来很好,除了我认为@Headers应该在技术上解析为<String,Object>的Map,但我不确定这会导致你看到的问题。