2012-03-31 35 views
20

Tengo varios mensajes en SQS. El siguiente código siempre devuelve solo uno, incluso si hay docenas visibles (no en vuelo). setMaxNumberOfMessages Pensé que permitiría que se consumieran múltiples a la vez. ¿Lo he entendido mal?Recuperar mensajes múltiples de 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 
} 

También he intentado usar withMaxNumberOfMessages sin tal suerte:

receiveMessageRequest.withMaxNumberOfMessages(10); 

¿Cómo sé que hay mensajes en la cola? ¿Más de 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")); 

Lo anterior siempre se ejecuta antes y me da una int que es> 1

Gracias por su entrada

Respuesta

27

AWS API Reference Guide: Query/QueryReceiveMessage

Debido a la naturaleza distribuida de la cola, un conjunto ponderado aleatorio de máquinas se muestrea en una llamada ReceiveMessage. Eso significa que solo se devuelven los mensajes en las máquinas muestreadas. Si la cantidad de mensajes en la cola es pequeña (menos de 1000), es probable que reciba menos mensajes de los solicitados por cada llamada a ReceiveMessage. Si el número de mensajes en la cola es extremadamente pequeño, es posible que no reciba ningún mensaje en una respuesta particular de ReceiveMessage; en cuyo caso debes repetir la solicitud.

y

MaxNumberOfMessages: El número máximo de mensajes que se devolverán. SQS nunca devuelve más mensajes que este valor, pero podría devolver menos.

+1

Su enlace de referencia no está trabajando ahora, ¿podría actualizarlo? Supongo que es http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/sqs/AmazonSQSClient.html#receiveMessage(java.lang.String) – coderz

1

receiveMessageRequest.withMaxNumberOfMessages (10);

Para ser claros, el uso más práctico de este habría que añadir a su constructor de la siguiente manera:

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

De lo contrario, puede ser que también acaba de hacer:

receiveMessageRequest.setMaxNumberOfMessages(10); 

Dicho esto, cambiar esto no ayudará al problema original.

4

Tuve el mismo problema. ¿Cuál es el tiempo de espera de su mensaje de recepción para establecer su cola? Cuando el mío estaba en 0, solo devolvió 1 mensaje, incluso si había 8 en la cola. Cuando aumenté el tiempo de espera de recepción de mensaje, los obtuve a todos. Me parece un poco problemático.

6

Hay una explicación completa de este comportamiento (posiblemente bastante idiosincrásico) en el SQS reference documentation.

SQS stores copies of messages on multiple servers y recibir las solicitudes de mensajes se hacen a estos servidores con uno de two possible strategies,

  • sondeo corta: El comportamiento predeterminado, sólo un subconjunto de los servidores (basado en una distribución aleatoria ponderada) son consultado.
  • Encuesta larga: habilitada estableciendo el atributo WaitTimeSeconds en un valor distinto de cero, se consultan todos los servidores.

En la práctica, para mis pruebas limitadas, siempre parece que recibo un mensaje con una breve encuesta al igual que lo hizo.

0

Estaba haciendo lo mismo y con la ayuda de estos dos atributos setMaxNumberOfMessages y setWaitTimeSeconds pude obtener 10 mensajes.

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

Instantánea de O/P:

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