0
0
AwsHow-ToBeginner · 4 min read

How to Receive Messages from AWS SQS Queues Easily

To receive messages from an AWS SQS queue, use the ReceiveMessage API call specifying the queue URL. This call returns messages that you can process, then delete with DeleteMessage to avoid reprocessing.
📐

Syntax

The basic syntax to receive messages from an SQS queue involves calling the ReceiveMessage API with parameters like QueueUrl, MaxNumberOfMessages, and WaitTimeSeconds.

  • QueueUrl: The URL of the SQS queue to receive messages from.
  • MaxNumberOfMessages: The maximum number of messages to return (up to 10).
  • WaitTimeSeconds: How long to wait for messages if the queue is empty (long polling).
json
{
  QueueUrl: "string",
  MaxNumberOfMessages?: number, // 1-10
  WaitTimeSeconds?: number, // 0-20
  VisibilityTimeout?: number // seconds
}
💻

Example

This example shows how to receive messages from an SQS queue using AWS SDK for JavaScript (v3). It receives up to 5 messages, prints their content, and deletes them to prevent reprocessing.

javascript
import { SQSClient, ReceiveMessageCommand, DeleteMessageCommand } from "@aws-sdk/client-sqs";

const sqsClient = new SQSClient({ region: "us-east-1" });
const queueUrl = "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue";

async function receiveMessages() {
  try {
    const receiveParams = {
      QueueUrl: queueUrl,
      MaxNumberOfMessages: 5,
      WaitTimeSeconds: 10
    };

    const data = await sqsClient.send(new ReceiveMessageCommand(receiveParams));

    if (!data.Messages || data.Messages.length === 0) {
      console.log("No messages to receive.");
      return;
    }

    for (const message of data.Messages) {
      console.log("Received message:", message.Body);

      // Delete message after processing
      const deleteParams = {
        QueueUrl: queueUrl,
        ReceiptHandle: message.ReceiptHandle
      };
      await sqsClient.send(new DeleteMessageCommand(deleteParams));
      console.log("Deleted message with ID:", message.MessageId);
    }
  } catch (err) {
    console.error("Error receiving messages:", err);
  }
}

receiveMessages();
Output
Received message: Hello from SQS! Deleted message with ID: 12345-abcde-67890 Received message: Another message Deleted message with ID: 67890-fghij-12345
⚠️

Common Pitfalls

  • Not deleting messages after processing causes them to reappear after visibility timeout.
  • Using MaxNumberOfMessages greater than 10 will cause errors.
  • Not setting WaitTimeSeconds results in short polling, which may miss messages and increase costs.
  • Ignoring ReceiptHandle when deleting messages will fail deletion.
javascript
/* Wrong: Not deleting message after receiving */
const receiveParams = { QueueUrl: queueUrl, MaxNumberOfMessages: 1 };
const data = await sqsClient.send(new ReceiveMessageCommand(receiveParams));
console.log(data.Messages[0].Body);
// Message will reappear after visibility timeout

/* Right: Delete message after processing */
const deleteParams = { QueueUrl: queueUrl, ReceiptHandle: data.Messages[0].ReceiptHandle };
await sqsClient.send(new DeleteMessageCommand(deleteParams));
📊

Quick Reference

Remember these key points when receiving messages from SQS:

  • Use ReceiveMessage with QueueUrl and MaxNumberOfMessages (max 10).
  • Set WaitTimeSeconds for long polling to reduce empty responses.
  • Always delete messages after processing using DeleteMessage and the message's ReceiptHandle.
  • Handle errors gracefully to avoid losing messages.

Key Takeaways

Use ReceiveMessage API with QueueUrl and MaxNumberOfMessages to get messages from SQS.
Set WaitTimeSeconds for long polling to efficiently wait for messages.
Always delete messages after processing using DeleteMessage and ReceiptHandle.
MaxNumberOfMessages cannot exceed 10 per request.
Handle errors and empty responses to build reliable message consumers.