web-dev-qa-db-ja.com

Amazon SQS Java SDK-メッセージ属性を受信できません

メッセージを送信する前に、次のコードを使用してSQSに属性を持つメッセージを投稿した後(およびSQSコンソールですべてが正しく投稿されているかどうかを確認する)...

messageRequest.addMessageAttributesEntry(
        "attributeTest", 
        new MessageAttributeValue()
            .withDataType("String")
            .withStringValue("attributeTest 123"));

メッセージ内のメッセージ属性を取得できません。結果として、私が見るのは「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.");
}

Amazon SQS SDKv1.8をJava 1.7 with Play Framework 2.2.3で使用しています。最初はSQSバージョンである可能性があると思いましたが、1.8.7にアップグレードしようとしましたが役に立ちませんでした。

見つかった公式ドキュメント ここ は、属性を読み取るためのソースコードをまったく提供していません。 github検索も、スタックオーバーフローもありません。私は何の成功もなく数時間試みてきました。

助けてくれてありがとう!

23
John Simoes

リクエストに必要なメッセージ属性を指定する必要があります(または「すべて」を使用してすべてのメッセージ属性を取得します)。したがって、あなたの場合はどちらかを使用できます

_List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("attributeTest")).getMessages();
_

または

_List<Message> messages = sqs.receiveMessage(receiveMessageRequest.withMessageAttributeNames("All")).getMessages();
_

メッセージと一緒に標準属性(ApproximateFirstReceiveTimestamp、ApproximateReceiveCount、SenderId、およびSentTimestamp)が必要な場合は、withAttributeNames("All")を使用します。詳細については、Javadocで ReceiveMessageRequest を参照してください。

50
Ramesh Sen