2012-03-31 40 views
20

SQSに複数のメッセージがあります。次のコード常には、表示されている数が(飛行していない場合でも)1つのみを返します。 setMaxNumberOfMessages私は考えて複数を一度に消費することができます..私はこれを誤解している?SQSから複数のメッセージを取得

CreateQueueRequest createQueueRequest = new CreateQueueRequest().withQueueName(queueName); 
String queueUrl = sqs.createQueue(createQueueRequest).getQueueUrl(); 
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl); 
receiveMessageRequest.setMaxNumberOfMessages(10); 
List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); 
for (Message message : messages) { 
     // i'm a message from SQS 
} 

私はまた、そのような運なしwithMaxNumberOfMessagesを使用して試してみた:

receiveMessageRequest.withMaxNumberOfMessages(10); 

は、どのように私は、メッセージがキューにある知っているのですか? 1以上?

Set<String> attrs = new HashSet<String>(); 
attrs.add("ApproximateNumberOfMessages"); 
CreateQueueRequest createQueueRequest = new CreateQueueRequest().withQueueName(queueName); 
GetQueueAttributesRequest a = new GetQueueAttributesRequest().withQueueUrl(sqs.createQueue(createQueueRequest).getQueueUrl()).withAttributeNames(attrs); 
Map<String,String> result = sqs.getQueueAttributes(a).getAttributes(); 
int num = Integer.parseInt(result.get("ApproximateNumberOfMessages")); 

上記常に前に実行してくれによりキューの分散性にご入力

答えて

27

AWS API Reference Guide: Query/QueryReceiveMessage

用> 1つの

おかげでintを与えています、 ReceiveMessage呼び出しで重み付けされたランダムなマシンセットがサンプリングされます。つまり、サンプリングされたマシン上のメッセージだけが返されます。キュー内のメッセージ数が少ない場合(1000未満)は、ReceiveMessageコールごとに要求したメッセージ数より少なくなる可能性があります。キュー内のメッセージ数が極端に少ない場合は、特定のReceiveMessageレスポンスでメッセージを受信しないことがあります。その場合は、要求を繰り返す必要があります。

MaxNumberOfMessages:返されるメッセージの最大数。 SQSはこの値よりも多くのメッセージを返すことはありませんが、はより少ないを返します。

+1

、あなたはそれを更新してくださいだろうか?私はそれがhttp://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/AmazonSQSClient.html#receiveMessage(java.lang.String)だと思います。 – coderz

1

receiveMessageRequest.withMaxNumberOfMessages(10)。

だけ明確にすること、これをより実用的な使用は、このようなあなたのコンストラクタに追加することです:

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(queueUrl).withMaxNumberOfMessages(10); 

そうでなければ、あなたにもちょうど行う可能性があります:

receiveMessageRequest.setMaxNumberOfMessages(10); 

つまり、これを変更しても元の問題は解決しません。

4

私は同じ問題を抱えていました。キューのReceive Message Wait Timeはどのように設定されていますか?鉱山が0のときは、キューに8があっても1メッセージしか返しませんでした。私がReceive Message Wait Timeを増やしたとき、私はそれらのすべてを得ました。私にバグのように見えます。

6

SQS reference documentationのこの(おそらくは独特な)動作の包括的な説明があります。

SQS stores copies of messages on multiple serversと受信メッセージの要求は、two possible strategiesのいずれかでこれらのサーバに対して行われ

  • ショートポーリング:デフォルトの動作、サーバ(重み付きランダム分布に基づいて)があるのサブセットのみ照会
  • ロングポーリング:WaitTimeSeconds属性をゼロ以外の値に設定すると、すべてのサーバーが照会されます

実際には、私の限られたテストでは、ちょうどあなたがしたように短いポーリングで1つのメッセージを得るようです。

0

私は同じことを試していましたが、これら2つの属性setMaxNumberOfMessagesとsetWaitTimeSecondsの助けを借りて、私は10個のメッセージを取得できました。

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl); 
         receiveMessageRequest.setMaxNumberOfMessages(10); 
         receiveMessageRequest.setWaitTimeSeconds(20); 

O/Pのスナップショット:あなたの参照リンクは、現在動作していない

Receiving messages from TestQueue. 
Number of messages:10 
Message 
MessageId:  31a7c669-1f0c-4bf1-b18b-c7fa31f4e82d 
...