AWS services or capabilities described in AWS Documentation may vary by region/location. Click Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Setting Visibility Timeout in Amazon SQS

When a message is received in Amazon SQS, it remains on the queue until it's deleted in order to ensure receipt. A message that was received, but not deleted, will be available in subsequent requests after a given visibility timeout to help prevent the message from being received more than once before it can be processed and deleted.

Note

When using standard queues, visibility timeout isn't a guarantee against receiving a message twice. If you are using a standard queue, be sure that your code can handle the case where the same message has been delivered more than once.

Setting the Message Visibility Timeout upon Message Receipt#

When you have received a message, you can modify its visibility timeout by passing its receipt handle in a ChangeMessageVisibilityRequest that you pass to the SQSClient class' ChangeMessageVisibility member function.

Includes

#include <aws/core/Aws.h>
#include <aws/sqs/SQSClient.h>
#include <aws/sqs/model/ChangeMessageVisibilityRequest.h>
#include <aws/sqs/model/ReceiveMessageRequest.h>

Code

Aws::Client::ClientConfiguration client_config;
client_config.requestTimeoutMs = 30000;

Aws::SQS::SQSClient sqs(client_config);

Aws::SQS::Model::ReceiveMessageRequest receive_request;
receive_request.SetQueueUrl(queue_url);
receive_request.SetMaxNumberOfMessages(1);

auto receive_outcome = sqs.ReceiveMessage(receive_request);
if (!receive_outcome.IsSuccess()) {
    std::cout << "Error receiving message from queue " << queue_url << ": "
        << receive_outcome.GetError().GetMessage() << std::endl;
    return;
}

const auto& messages = receive_outcome.GetResult().GetMessages();
if (messages.size() == 0) {
    std::cout << "No messages received from queue " << queue_url <<
        std::endl;
    return;
}

const auto& message = messages[0];
std::cout << "Received message:" << std::endl;
std::cout << "  MessageId: " << message.GetMessageId() << std::endl;
std::cout << "  ReceiptHandle: " << message.GetReceiptHandle() << std::endl;
std::cout << "  Body: " << message.GetBody() << std::endl << std::endl;

Aws::SQS::Model::ChangeMessageVisibilityRequest request;
request.SetQueueUrl(queue_url);
request.SetReceiptHandle(message.GetReceiptHandle());
request.SetVisibilityTimeout(visibility_timeout);
auto outcome = sqs.ChangeMessageVisibility(request);
if (outcome.IsSuccess()) {
    std::cout << "Successfully changed visibility of message " <<
        message.GetMessageId() << " from queue " << queue_url << std::endl;
} else {
    std::cout << "Error changing visibility of message " <<
        message.GetMessageId() << " from queue " << queue_url << ": " <<
        outcome.GetError().GetMessage() << std::endl;
}

See the complete example.

More Info#