Amazon SQS Java SDK - 无法接收消息属性

Joh*_*oes 23 java amazon-sqs

在发送带有以下代码的SQS属性的消息之后(并在SQS控制台中检查是否所有内容都正确发布)...

messageRequest.addMessageAttributesEntry(
        "attributeTest", 
        new MessageAttributeValue()
            .withDataType("String")
            .withStringValue("attributeTest 123"));
Run Code Online (Sandbox Code Playgroud)

我无法检索邮件中的任何邮件属性.因此,我所看到的只是"0属性".在Amazon SQS控制台中重新检查消息,消息 - 和属性 - 仍然存在.

// Message was previously checked in SQS console and contains 
// an attribute named "attributeTest"

AmazonSQS sqs = ...
List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
for (Message : messages) 
{
    Map<String, MessageAttributeValue> attributes = message.getMessageAttributes();
    System.out.println("" + attributes.size() + " attributes.");
}
Run Code Online (Sandbox Code Playgroud)

我在Java 1.7中使用Amazon SQS SDK v1.8和Play Framework 2.2.3.起初我认为它可能是SQS版本,但尝试升级到1.8.7无济于事.

这里找到的官方文档根本没有提供任何源代码来读取属性.也没有github搜索,堆栈溢出.我已经尝试了几个小时而没有任何成功.

谢谢你的帮助!

小智 49

您必须在请求中指定所需的消息属性(或使用"全部"获取所有消息属性).所以在你的情况下你可以使用其中之一

List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("attributeTest")).getMessages();
Run Code Online (Sandbox Code Playgroud)

要么

List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("All")).getMessages();
Run Code Online (Sandbox Code Playgroud)

如果您需要标准属性(ApproximateFirstReceiveTimestamp,ApproximateReceiveCount,SenderId和SentTimestamp)以及消息,请使用withAttributeNames("All").您可以在Javadocs中找到有关ReceiveMessageRequest的更多详细信息.

  • 一旦我注意到“.withAttributeNames()”和“.withMessageAttributeNames()”之间的区别,也为我工作。这里需要注意细节。哎哟! (2认同)