本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
啟用 Amazon SQS 訊息佇列的長輪詢
Amazon SQS 預設會使用短輪詢,根據加權隨機分佈僅查詢伺服器子集,以判斷回應中是否有任何訊息可供納入。
當沒有訊息可傳回以回覆傳送至 Amazon SQS 佇列的 ReceiveMessage 請求,並消除錯誤的空回應時,長輪詢有助於降低使用 Amazon SQS 的成本。您可以將長輪詢頻率設定為 1–20 秒。
先決條件
開始之前,建議您先閱讀開始使用 適用於 C++ 的 AWS SDK。
下載範例程式碼並建置解決方案,如 中所述程式碼範例入門。
若要執行範例,您的程式碼用來提出請求的使用者描述檔必須具有 AWS (針對 服務和 動作) 的適當許可。如需詳細資訊,請參閱提供 AWS 登入資料。
建立佇列時啟用長輪詢
若要在建立 Amazon SQS 佇列時啟用長輪詢,請在 CreateQueueRequest 物件上設定 ReceiveMessageWaitTimeSeconds
屬性,然後再呼叫 SQSClient 類別CreateQueue
的成員函數。
包括
#include <aws/core/Aws.h> #include <aws/sqs/SQSClient.h> #include <aws/sqs/model/CreateQueueRequest.h> #include <iostream>
Code
Aws::SQS::SQSClient sqsClient(clientConfiguration); Aws::SQS::Model::CreateQueueRequest request; request.SetQueueName(queueName); request.AddAttributes( Aws::SQS::Model::QueueAttributeName::ReceiveMessageWaitTimeSeconds, pollTimeSeconds); const Aws::SQS::Model::CreateQueueOutcome outcome = sqsClient.CreateQueue(request); if (outcome.IsSuccess()) { std::cout << "Successfully created queue " << queueName << std::endl; } else { std::cout << "Error creating queue " << queueName << ": " << outcome.GetError().GetMessage() << std::endl; }
請參閱完整範例
在現有佇列上啟用長輪詢
除了在建立佇列時啟用長輪詢之外,您也可以在呼叫 SQSClient 類別SetQueueAttributes
的成員函數之前,在 SetQueueAttributesRequest ReceiveMessageWaitTimeSeconds
上設定 ,在現有佇列上啟用它。
包括
#include <aws/core/Aws.h> #include <aws/sqs/SQSClient.h> #include <aws/sqs/model/SetQueueAttributesRequest.h> #include <iostream>
Code
Aws::SQS::SQSClient sqsClient(clientConfiguration); Aws::SQS::Model::SetQueueAttributesRequest request; request.SetQueueUrl(queueURL); request.AddAttributes( Aws::SQS::Model::QueueAttributeName::ReceiveMessageWaitTimeSeconds, pollTimeSeconds); const Aws::SQS::Model::SetQueueAttributesOutcome outcome = sqsClient.SetQueueAttributes( request); if (outcome.IsSuccess()) { std::cout << "Successfully updated long polling time for queue " << queueURL << " to " << pollTimeSeconds << std::endl; } else { std::cout << "Error updating long polling time for queue " << queueURL << ": " << outcome.GetError().GetMessage() << std::endl; }
請參閱完整範例
在收到訊息時啟用長輪詢
您可以在接收訊息時啟用長輪詢,方法是在提供給 SQSClient 類別的 ReceiveMessageRequest 上設定以秒為單位的等待時間。 ReceiveMessage
注意
您應該確保 AWS 用戶端的請求逾時大於最長長輪詢時間 (20 秒),讓您的ReceiveMessage
請求在等待下一個輪詢事件時不會逾時!
包括
#include <aws/core/Aws.h> #include <aws/sqs/SQSClient.h> #include <aws/sqs/model/ReceiveMessageRequest.h>
Code
Aws::SQS::SQSClient sqsClient(customConfiguration); Aws::SQS::Model::ReceiveMessageRequest request; request.SetQueueUrl(queueUrl); request.SetMaxNumberOfMessages(1); request.SetWaitTimeSeconds(waitTimeSeconds); auto outcome = sqsClient.ReceiveMessage(request); if (outcome.IsSuccess()) { const auto &messages = outcome.GetResult().GetMessages(); if (messages.empty()) { std::cout << "No messages received from queue " << queueUrl << std::endl; } else { 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; } } else { std::cout << "Error receiving message from queue " << queueUrl << ": " << outcome.GetError().GetMessage() << std::endl; }
請參閱完整範例
詳細資訊
-
Amazon Simple Queue Service API 參考中的 CreateQueue
-
Amazon Simple Queue Service API 參考中的 ReceiveMessage
-
Amazon Simple Queue Service API 參考中的 SetQueueAttributes