Menu
AWS SDK for C++
Developer Guide

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.

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.

Note

These code snippets assume that you understand the material in Getting Started Using the AWS SDK for C++ and have configured default AWS credentials using the information in Providing AWS Credentials.

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

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

Code

Copy
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