Retrieve multiple messages from SQS

后端 未结 8 1949
逝去的感伤
逝去的感伤 2020-12-10 00:55

I have multiple messages in SQS. The following code always returns only one, even if there are dozens visible (not in flight). setMaxNumberOfMessages I th

8条回答
  •  独厮守ぢ
    2020-12-10 01:19

    For small task list I use FIFO queue like stackoverflow.com/a/55149351/13678017 for example modified AWS tutorial

                // Create a queue.
            System.out.println("Creating a new Amazon SQS FIFO queue called " + "MyFifoQueue.fifo.\n");
            final Map attributes = new HashMap<>();
    
            // A FIFO queue must have the FifoQueue attribute set to true.
            attributes.put("FifoQueue", "true");
            /*
             * If the user doesn't provide a MessageDeduplicationId, generate a
             * MessageDeduplicationId based on the content.
             */
            attributes.put("ContentBasedDeduplication", "true");
            // The FIFO queue name must end with the .fifo suffix.
            final CreateQueueRequest createQueueRequest = new CreateQueueRequest("MyFifoQueue4.fifo")
                            .withAttributes(attributes);
            final String myQueueUrl = sqs.createQueue(createQueueRequest).getQueueUrl();
    
            // List all queues.
            System.out.println("Listing all queues in your account.\n");
            for (final String queueUrl : sqs.listQueues().getQueueUrls()) {
                System.out.println("  QueueUrl: " + queueUrl);
            }
            System.out.println();
    
            // Send a message.
            System.out.println("Sending a message to MyQueue.\n");
    
            for (int i = 0; i < 4; i++) {
    
                var request = new SendMessageRequest()
                        .withQueueUrl(myQueueUrl)
                        .withMessageBody("message " + i)
                        .withMessageGroupId("userId1");
                        ;
    
                sqs.sendMessage(request);
            }
    
            for (int i = 0; i < 6; i++) {
    
                var request = new SendMessageRequest()
                        .withQueueUrl(myQueueUrl)
                        .withMessageBody("message " + i)
                        .withMessageGroupId("userId2");
                        ;
    
                sqs.sendMessage(request);
            }
    
            // Receive messages.
            System.out.println("Receiving messages from MyQueue.\n");
            var receiveMessageRequest = new ReceiveMessageRequest(myQueueUrl);
    
            receiveMessageRequest.setMaxNumberOfMessages(10);
            receiveMessageRequest.setWaitTimeSeconds(20);
    
            // what receive?
            receiveMessageRequest.withMessageAttributeNames("userId2");
    
    
            final List messages = sqs.receiveMessage(receiveMessageRequest).getMessages();
            for (final Message message : messages) {
                System.out.println("Message");
                System.out.println("  MessageId:     "
                        + message.getMessageId());
                System.out.println("  ReceiptHandle: "
                        + message.getReceiptHandle());
                System.out.println("  MD5OfBody:     "
                        + message.getMD5OfBody());
                System.out.println("  Body:          "
                        + message.getBody());
                for (final Entry entry : message.getAttributes()
                        .entrySet()) {
                    System.out.println("Attribute");
                    System.out.println("  Name:  " + entry
                            .getKey());
                    System.out.println("  Value: " + entry
                            .getValue());
                }
            }
    

提交回复
热议问题