Création de files d'attente Amazon SQS - AWS SDK for .NET

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Création de files d'attente Amazon SQS

Cet exemple vous montre comment utiliser le pour AWS SDK for .NET créer une file d'attente Amazon SQS. L'application crée une file d'attente contenant des lettres mortes si vous n'en fournissez pas l'ARN. Il crée ensuite une file de messages standard, qui inclut une file de lettres mortes (celle que vous avez fournie ou celle qui a été créée).

Si vous ne fournissez aucun argument de ligne de commande, l'application affiche simplement des informations sur toutes les files d'attente existantes.

Les sections suivantes fournissent des extraits de cet exemple. Le code complet de l'exemple est affiché ensuite et peut être créé et exécuté tel quel.

Afficher les files d'attente existantes

L'extrait suivant présente une liste des files d'attente existantes dans la région du client SQS et les attributs de chaque file d'attente.

L'exemple à la fin de cette rubrique montre cet extrait en cours d'utilisation.

// // Method to show a list of the existing queues private static async Task ShowQueues(IAmazonSQS sqsClient) { ListQueuesResponse responseList = await sqsClient.ListQueuesAsync(""); Console.WriteLine(); foreach(string qUrl in responseList.QueueUrls) { // Get and show all attributes. Could also get a subset. await ShowAllAttributes(sqsClient, qUrl); } } // // Method to show all attributes of a queue private static async Task ShowAllAttributes(IAmazonSQS sqsClient, string qUrl) { var attributes = new List<string>{ QueueAttributeName.All }; GetQueueAttributesResponse responseGetAtt = await sqsClient.GetQueueAttributesAsync(qUrl, attributes); Console.WriteLine($"Queue: {qUrl}"); foreach(var att in responseGetAtt.Attributes) Console.WriteLine($"\t{att.Key}: {att.Value}"); }

Création de la file d'attente

L'extrait de code suivant crée une file d'attente. L'extrait inclut l'utilisation d'une file d'attente de lettres mortes, mais une file d'attente de lettres mortes n'est pas nécessairement requise pour vos files d'attente.

L'exemple à la fin de cette rubrique montre cet extrait en cours d'utilisation.

// // Method to create a queue. Returns the queue URL. private static async Task<string> CreateQueue( IAmazonSQS sqsClient, string qName, string deadLetterQueueUrl=null, string maxReceiveCount=null, string receiveWaitTime=null) { var attrs = new Dictionary<string, string>(); // If a dead-letter queue is given, create a message queue if(!string.IsNullOrEmpty(deadLetterQueueUrl)) { attrs.Add(QueueAttributeName.ReceiveMessageWaitTimeSeconds, receiveWaitTime); attrs.Add(QueueAttributeName.RedrivePolicy, $"{{\"deadLetterTargetArn\":\"{await GetQueueArn(sqsClient, deadLetterQueueUrl)}\"," + $"\"maxReceiveCount\":\"{maxReceiveCount}\"}}"); // Add other attributes for the message queue such as VisibilityTimeout } // If no dead-letter queue is given, create one of those instead //else //{ // // Add attributes for the dead-letter queue as needed // attrs.Add(); //} // Create the queue CreateQueueResponse responseCreate = await sqsClient.CreateQueueAsync( new CreateQueueRequest{QueueName = qName, Attributes = attrs}); return responseCreate.QueueUrl; }

Obtenir l'ARN d'une file d'attente

L'extrait suivant obtient l'ARN de la file d'attente identifiée par l'URL de file d'attente donnée.

L'exemple à la fin de cette rubrique montre cet extrait en cours d'utilisation.

// // Method to get the ARN of a queue private static async Task<string> GetQueueArn(IAmazonSQS sqsClient, string qUrl) { GetQueueAttributesResponse responseGetAtt = await sqsClient.GetQueueAttributesAsync( qUrl, new List<string>{QueueAttributeName.QueueArn}); return responseGetAtt.QueueARN; }

Code complet

Cette section présente les références pertinentes et le code complet de cet exemple.

using System; using System.Threading.Tasks; using System.Collections.Generic; using Amazon.SQS; using Amazon.SQS.Model; namespace SQSCreateQueue { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to create a queue class Program { private const string MaxReceiveCount = "10"; private const string ReceiveMessageWaitTime = "2"; private const int MaxArgs = 3; static async Task Main(string[] args) { // Parse the command line and show help if necessary var parsedArgs = CommandLine.Parse(args); if(parsedArgs.Count > MaxArgs) CommandLine.ErrorExit( "\nToo many command-line arguments.\nRun the command with no arguments to see help."); // Create the Amazon SQS client var sqsClient = new AmazonSQSClient(); // In the case of no command-line arguments, just show help and the existing queues if(parsedArgs.Count == 0) { PrintHelp(); Console.WriteLine("\nNo arguments specified."); Console.Write("Do you want to see a list of the existing queues? ((y) or n): "); string response = Console.ReadLine(); if((string.IsNullOrEmpty(response)) || (response.ToLower() == "y")) await ShowQueues(sqsClient); return; } // Get the application arguments from the parsed list string queueName = CommandLine.GetArgument(parsedArgs, null, "-q", "--queue-name"); string deadLetterQueueUrl = CommandLine.GetArgument(parsedArgs, null, "-d", "--dead-letter-queue"); string maxReceiveCount = CommandLine.GetArgument(parsedArgs, MaxReceiveCount, "-m", "--max-receive-count"); string receiveWaitTime = CommandLine.GetArgument(parsedArgs, ReceiveMessageWaitTime, "-w", "--wait-time"); if(string.IsNullOrEmpty(queueName)) CommandLine.ErrorExit( "\nYou must supply a queue name.\nRun the command with no arguments to see help."); // If a dead-letter queue wasn't given, create one if(string.IsNullOrEmpty(deadLetterQueueUrl)) { Console.WriteLine("\nNo dead-letter queue was specified. Creating one..."); deadLetterQueueUrl = await CreateQueue(sqsClient, queueName + "__dlq"); Console.WriteLine($"Your new dead-letter queue:"); await ShowAllAttributes(sqsClient, deadLetterQueueUrl); } // Create the message queue string messageQueueUrl = await CreateQueue( sqsClient, queueName, deadLetterQueueUrl, maxReceiveCount, receiveWaitTime); Console.WriteLine($"Your new message queue:"); await ShowAllAttributes(sqsClient, messageQueueUrl); } // // Method to show a list of the existing queues private static async Task ShowQueues(IAmazonSQS sqsClient) { ListQueuesResponse responseList = await sqsClient.ListQueuesAsync(""); Console.WriteLine(); foreach(string qUrl in responseList.QueueUrls) { // Get and show all attributes. Could also get a subset. await ShowAllAttributes(sqsClient, qUrl); } } // // Method to create a queue. Returns the queue URL. private static async Task<string> CreateQueue( IAmazonSQS sqsClient, string qName, string deadLetterQueueUrl=null, string maxReceiveCount=null, string receiveWaitTime=null) { var attrs = new Dictionary<string, string>(); // If a dead-letter queue is given, create a message queue if(!string.IsNullOrEmpty(deadLetterQueueUrl)) { attrs.Add(QueueAttributeName.ReceiveMessageWaitTimeSeconds, receiveWaitTime); attrs.Add(QueueAttributeName.RedrivePolicy, $"{{\"deadLetterTargetArn\":\"{await GetQueueArn(sqsClient, deadLetterQueueUrl)}\"," + $"\"maxReceiveCount\":\"{maxReceiveCount}\"}}"); // Add other attributes for the message queue such as VisibilityTimeout } // If no dead-letter queue is given, create one of those instead //else //{ // // Add attributes for the dead-letter queue as needed // attrs.Add(); //} // Create the queue CreateQueueResponse responseCreate = await sqsClient.CreateQueueAsync( new CreateQueueRequest{QueueName = qName, Attributes = attrs}); return responseCreate.QueueUrl; } // // Method to get the ARN of a queue private static async Task<string> GetQueueArn(IAmazonSQS sqsClient, string qUrl) { GetQueueAttributesResponse responseGetAtt = await sqsClient.GetQueueAttributesAsync( qUrl, new List<string>{QueueAttributeName.QueueArn}); return responseGetAtt.QueueARN; } // // Method to show all attributes of a queue private static async Task ShowAllAttributes(IAmazonSQS sqsClient, string qUrl) { var attributes = new List<string>{ QueueAttributeName.All }; GetQueueAttributesResponse responseGetAtt = await sqsClient.GetQueueAttributesAsync(qUrl, attributes); Console.WriteLine($"Queue: {qUrl}"); foreach(var att in responseGetAtt.Attributes) Console.WriteLine($"\t{att.Key}: {att.Value}"); } // // Command-line help private static void PrintHelp() { Console.WriteLine( "\nUsage: SQSCreateQueue -q <queue-name> [-d <dead-letter-queue>]" + " [-m <max-receive-count>] [-w <wait-time>]" + "\n -q, --queue-name: The name of the queue you want to create." + "\n -d, --dead-letter-queue: The URL of an existing queue to be used as the dead-letter queue."+ "\n If this argument isn't supplied, a new dead-letter queue will be created." + "\n -m, --max-receive-count: The value for maxReceiveCount in the RedrivePolicy of the queue." + $"\n Default is {MaxReceiveCount}." + "\n -w, --wait-time: The value for ReceiveMessageWaitTimeSeconds of the queue for long polling." + $"\n Default is {ReceiveMessageWaitTime}."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class that represents a command line on the console or terminal. // (This is the same for all examples. When you have seen it once, you can ignore it.) static class CommandLine { // // Method to parse a command line of the form: "--key value" or "-k value". // // Parameters: // - args: The command-line arguments passed into the application by the system. // // Returns: // A Dictionary with string Keys and Values. // // If a key is found without a matching value, Dictionary.Value is set to the key // (including the dashes). // If a value is found without a matching key, Dictionary.Key is set to "--NoKeyN", // where "N" represents sequential numbers. public static Dictionary<string,string> Parse(string[] args) { var parsedArgs = new Dictionary<string,string>(); int i = 0, n = 0; while(i < args.Length) { // If the first argument in this iteration starts with a dash it's an option. if(args[i].StartsWith("-")) { var key = args[i++]; var value = key; // Check to see if there's a value that goes with this option? if((i < args.Length) && (!args[i].StartsWith("-"))) value = args[i++]; parsedArgs.Add(key, value); } // If the first argument in this iteration doesn't start with a dash, it's a value else { parsedArgs.Add("--NoKey" + n.ToString(), args[i++]); n++; } } return parsedArgs; } // // Method to get an argument from the parsed command-line arguments // // Parameters: // - parsedArgs: The Dictionary object returned from the Parse() method (shown above). // - defaultValue: The default string to return if the specified key isn't in parsedArgs. // - keys: An array of keys to look for in parsedArgs. public static string GetArgument( Dictionary<string,string> parsedArgs, string defaultReturn, params string[] keys) { string retval = null; foreach(var key in keys) if(parsedArgs.TryGetValue(key, out retval)) break; return retval ?? defaultReturn; } // // Method to exit the application with an error. public static void ErrorExit(string msg, int code=1) { Console.WriteLine("\nError"); Console.WriteLine(msg); Environment.Exit(code); } } }

Considérations supplémentaires

  • Le nom de votre file d'attente doit être composé de caractères alphanumériques, de traits d'union et de traits de soulignement.

  • Les noms et les URL des files d'attente distinguent les majuscules et minuscules

  • Si vous avez besoin de l'URL de la file d'attente mais que vous n'avez que le nom de la file d'attente, utilisez l'une AmazonSQSClient.GetQueueUrlAsync des méthodes.

  • Cet exemple indique une longue période d'interrogation pour tous les messages de la file d'attente que vous créez. Cela se fait à l'aide de l'ReceiveMessageWaitTimeSecondsattribut.

    Vous pouvez également spécifier un long sondage lors d'un appel aux ReceiveMessageAsync méthodes de la classe AmazonSQSClient. Pour plus d’informations, consultez Réception de messages Amazon SQS.

    Pour plus d'informations sur les sondages courts par rapport aux sondages longs, consultez la section Sondage court et long du manuel Amazon Simple Queue Service Developer Guide.

  • Une file d'attente de lettres mortes est une file que les autres files d'attente (source) peuvent cibler pour les messages qui ne sont pas traités correctement. Pour plus d'informations, consultez les files d'attente contenant des lettres mortes Amazon SQS dans le guide du développeur Amazon Simple Queue Service.

  • Vous pouvez également consulter la liste des files d'attente et les résultats de cet exemple dans la console Amazon SQS.