Creazione di code Amazon SQS - AWS SDK for .NET

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Creazione di code Amazon SQS

Questo esempio mostra come utilizzare per AWS SDK for .NET creare una coda Amazon SQS. L'applicazione crea una coda di lettere non scritte se non viene fornito l'ARN corrispondente. Quindi crea una coda di messaggi standard, che include una coda di lettere non scritte (quella che hai fornito o quella che è stata creata).

Se non fornite alcun argomento della riga di comando, l'applicazione mostra semplicemente le informazioni su tutte le code esistenti.

Le sezioni seguenti forniscono frammenti di questo esempio. Successivamente viene mostrato il codice completo dell'esempio, che può essere creato ed eseguito così com'è.

Mostra le code esistenti

Il seguente frammento mostra un elenco delle code esistenti nella regione del client SQS e gli attributi di ciascuna coda.

L'esempio alla fine di questo argomento mostra questo frammento in uso.

// // 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}"); }

Crea la coda

Il seguente frammento crea una coda. Lo snippet include l'uso di una coda di lettere morte, ma una coda di lettere morte non è necessariamente necessaria per le code.

L'esempio alla fine di questo argomento mostra questo frammento in uso.

// // 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; }

Ottieni l'ARN di una coda

Il seguente frammento ottiene l'ARN della coda identificata dall'URL della coda specificato.

L'esempio alla fine di questo argomento mostra questo frammento in uso.

// // 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; }

Codice completo

Questa sezione mostra i riferimenti pertinenti e il codice completo per questo esempio.

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); } } }

Ulteriori considerazioni

  • Il nome della coda deve essere composto da caratteri alfanumerici, trattini e caratteri di sottolineatura.

  • I nomi e gli URL delle code fanno distinzione tra maiuscole e minuscole

  • Se hai bisogno dell'URL della coda ma hai solo il nome della coda, usa uno dei metodi. AmazonSQSClient.GetQueueUrlAsync

  • Questo esempio specifica un polling lungo per tutti i messaggi sulla coda che crei. Questa operazione viene eseguita utilizzando l'attributo. ReceiveMessageWaitTimeSeconds

    Puoi anche specificare un polling lungo durante una chiamata ai ReceiveMessageAsync metodi della classe AmazonSQSClient. Per ulteriori informazioni, consulta Ricezione di messaggi Amazon SQS.

    Per informazioni sul polling breve rispetto al polling lungo, consulta Short and long polling nella Amazon Simple Queue Service Developer Guide.

  • Una coda di lettere morte è quella che altre code (di origine) possono indirizzare per i messaggi che non vengono elaborati correttamente. Per ulteriori informazioni, consulta le code di lettera morta di Amazon SQS nella Guida per gli sviluppatori di Amazon Simple Queue Service.

  • Puoi anche visualizzare l'elenco delle code e i risultati di questo esempio nella console Amazon SQS.