接收 Amazon SQS 消息 - Amazon SDK for .NET
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

是否要将 .NET 应用程序部署到Amazon通过几个简单点击即可? 尝试我们的新.NET CLI 工具为了简化部署体验!阅读我们的博客帖子然后提交反馈GitHub

有关更多信息,请参阅部署工具

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

接收 Amazon SQS 消息

此示例向您演示如何使用Amazon SDK for .NET以接收来自 Amazon SQS 队列的消息,您可以创建该队列以编程方式或者通过使用Amazon SQS 控制台. 应用程序从队列中读取一条消息,处理消息(在这种情况下,在控制台上显示消息正文),然后从队列中删除该消息。应用程序将重复这些步骤,直到用户在键盘上键入键。

这个例子和之前关于发送消息的示例可以一起使用以查看 Amazon SQS 中的消息流。

以下各节提供了此示例的代码段。这些区域有:例子的完整代码在此之后显示,并且可以按原样构建和运行。

接收消息

以下代码段接收来自给定队列 URL 标识的队列的消息。

这个示例本主题末尾的显示了这个片段正在使用中。

// // Method to read a message from the given queue // In this example, it gets one message at a time private static async Task<ReceiveMessageResponse> GetMessage( IAmazonSQS sqsClient, string qUrl, int waitTime=0) { return await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest{ QueueUrl=qUrl, MaxNumberOfMessages=MaxMessages, WaitTimeSeconds=waitTime // (Could also request attributes, set visibility timeout, etc.) }); }

删除消息

以下代码段从给定队列 URL 标识的队列中删除消息。

这个示例本主题末尾的显示了这个片段正在使用中。

// // Method to delete a message from a queue private static async Task DeleteMessage( IAmazonSQS sqsClient, Message message, string qUrl) { Console.WriteLine($"\nDeleting message {message.MessageId} from queue..."); await sqsClient.DeleteMessageAsync(qUrl, message.ReceiptHandle); }

代码完成

本节显示本示例的相关参考文献和完整代码。

NuGet 软件包:

编程元素:

using System; using System.Threading.Tasks; using Amazon.SQS; using Amazon.SQS.Model; namespace SQSReceiveMessages { class Program { private const int MaxMessages = 1; private const int WaitTime = 2; static async Task Main(string[] args) { // Do some checks on the command-line if(args.Length == 0) { Console.WriteLine("\nUsage: SQSReceiveMessages queue_url"); Console.WriteLine(" queue_url - The URL of an existing SQS queue."); return; } if(!args[0].StartsWith("https://sqs.")) { Console.WriteLine("\nThe command-line argument isn't a queue URL:"); Console.WriteLine($"{args[0]}"); return; } // Create the Amazon SQS client var sqsClient = new AmazonSQSClient(); // (could verify that the queue exists) // Read messages from the queue and perform appropriate actions Console.WriteLine($"Reading messages from queue\n {args[0]}"); Console.WriteLine("Press any key to stop. (Response might be slightly delayed.)"); do { var msg = await GetMessage(sqsClient, args[0], WaitTime); if(msg.Messages.Count != 0) { if(ProcessMessage(msg.Messages[0])) await DeleteMessage(sqsClient, msg.Messages[0], args[0]); } } while(!Console.KeyAvailable); } // // Method to read a message from the given queue // In this example, it gets one message at a time private static async Task<ReceiveMessageResponse> GetMessage( IAmazonSQS sqsClient, string qUrl, int waitTime=0) { return await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest{ QueueUrl=qUrl, MaxNumberOfMessages=MaxMessages, WaitTimeSeconds=waitTime // (Could also request attributes, set visibility timeout, etc.) }); } // // Method to process a message // In this example, it simply prints the message private static bool ProcessMessage(Message message) { Console.WriteLine($"\nMessage body of {message.MessageId}:"); Console.WriteLine($"{message.Body}"); return true; } // // Method to delete a message from a queue private static async Task DeleteMessage( IAmazonSQS sqsClient, Message message, string qUrl) { Console.WriteLine($"\nDeleting message {message.MessageId} from queue..."); await sqsClient.DeleteMessageAsync(qUrl, message.ReceiptHandle); } } }

其他注意事项

  • 要指定长轮询,本示例使用WaitTimeSeconds每次调用的属性ReceiveMessageAsync方法。

    您还可以使用ReceiveMessageWaitTimeSeconds属性时creating或者正在更新队列。

    有关短轮询与长轮询的信息,请参阅短轮询和长轮询中的Amazon Simple Queue Service 开发者指南.

  • 在消息处理过程中,您可以使用接收句柄更改消息可见性超时。有关如何执行此操作的信息,请参阅ChangeMessageVisibilityAsync使用的方法AmazonSQSClient类。

  • 调用DeleteMessageAsync方法将无条件地从队列中删除消息,而无论可见性超时设置如何。