View a markdown version of this page

更新 Amazon SQS 佇列 - AWS SDK for .NET (V4)

第 4 版 (V4) AWS SDK for .NET 已發行!

如需有關中斷變更和遷移應用程式的資訊,請參閱遷移主題

Orange button with text "Click here for details".

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

更新 Amazon SQS 佇列

此範例說明如何使用 AWS SDK for .NET 來更新 Amazon SQS 佇列。經過一些檢查後,應用程式會使用指定的值更新指定的屬性,然後顯示佇列的所有屬性。

如果命令列引數中只包含佇列 URL,則應用程式只會顯示佇列的所有屬性。

下列各節提供此範例的程式碼片段。之後會顯示範例的完整程式碼,並可依原樣建置和執行。

顯示佇列屬性

下列程式碼片段顯示指定佇列 URL 所識別佇列的屬性。

本主題結尾的範例顯示此程式碼片段正在使用中。

// // Method to show all attributes of a queue private static async Task ShowAllAttributes(IAmazonSQS sqsClient, string qUrl) { GetQueueAttributesResponse responseGetAtt = await sqsClient.GetQueueAttributesAsync(qUrl, new List<string>{ QueueAttributeName.All }); Console.WriteLine($"Queue: {qUrl}"); foreach(var att in responseGetAtt.Attributes) Console.WriteLine($"\t{att.Key}: {att.Value}"); }

驗證屬性名稱

下列程式碼片段會驗證要更新的屬性名稱。

本主題結尾的範例顯示此程式碼片段正在使用中。

// // Method to check the name of the attribute private static bool ValidAttribute(string attribute) { var attOk = false; var qAttNameType = typeof(QueueAttributeName); List<string> qAttNamefields = new List<string>(); foreach(var field in qAttNameType.GetFields()) qAttNamefields.Add(field.Name); foreach(var name in qAttNamefields) if(attribute == name) { attOk = true; break; } return attOk; }

更新佇列屬性

下列程式碼片段會更新指定佇列 URL 所識別之佇列的屬性。

本主題結尾的範例顯示此程式碼片段正在使用中。

// // Method to update a queue attribute private static async Task UpdateAttribute( IAmazonSQS sqsClient, string qUrl, string attribute, string value) { await sqsClient.SetQueueAttributesAsync(qUrl, new Dictionary<string, string>{{attribute, value}}); }

完成程式碼

本節顯示此範例的相關參考和完整程式碼。

NuGet 套件:

程式設計元素:

using System; using System.Collections.Generic; using System.Threading.Tasks; using Amazon.SQS; using Amazon.SQS.Model; namespace SQSUpdateQueue { // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // Class to update a queue class Program { private const int MaxArgs = 3; private const int InvalidArgCount = 2; static async Task Main(string[] args) { // Parse the command line and show help if necessary var parsedArgs = CommandLine.Parse(args); if(parsedArgs.Count == 0) { PrintHelp(); return; } if((parsedArgs.Count > MaxArgs) || (parsedArgs.Count == InvalidArgCount)) CommandLine.ErrorExit("\nThe number of command-line arguments is incorrect." + "\nRun the command with no arguments to see help."); // Get the application arguments from the parsed list var qUrl = CommandLine.GetArgument(parsedArgs, null, "-q"); var attribute = CommandLine.GetArgument(parsedArgs, null, "-a"); var value = CommandLine.GetArgument(parsedArgs, null, "-v", "--value"); if(string.IsNullOrEmpty(qUrl)) CommandLine.ErrorExit("\nYou must supply at least a queue URL." + "\nRun the command with no arguments to see help."); // Create the Amazon SQS client var sqsClient = new AmazonSQSClient(); // In the case of one command-line argument, just show the attributes for the queue if(parsedArgs.Count == 1) await ShowAllAttributes(sqsClient, qUrl); // Otherwise, attempt to update the given queue attribute with the given value else { // Check to see if the attribute is valid if(ValidAttribute(attribute)) { // Perform the update and then show all the attributes of the queue await UpdateAttribute(sqsClient, qUrl, attribute, value); await ShowAllAttributes(sqsClient, qUrl); } else { Console.WriteLine($"\nThe given attribute name, {attribute}, isn't valid."); } } } // // Method to show all attributes of a queue private static async Task ShowAllAttributes(IAmazonSQS sqsClient, string qUrl) { GetQueueAttributesResponse responseGetAtt = await sqsClient.GetQueueAttributesAsync(qUrl, new List<string>{ QueueAttributeName.All }); Console.WriteLine($"Queue: {qUrl}"); foreach(var att in responseGetAtt.Attributes) Console.WriteLine($"\t{att.Key}: {att.Value}"); } // // Method to check the name of the attribute private static bool ValidAttribute(string attribute) { var attOk = false; var qAttNameType = typeof(QueueAttributeName); List<string> qAttNamefields = new List<string>(); foreach(var field in qAttNameType.GetFields()) qAttNamefields.Add(field.Name); foreach(var name in qAttNamefields) if(attribute == name) { attOk = true; break; } return attOk; } // // Method to update a queue attribute private static async Task UpdateAttribute( IAmazonSQS sqsClient, string qUrl, string attribute, string value) { await sqsClient.SetQueueAttributesAsync(qUrl, new Dictionary<string, string>{{attribute, value}}); } // // Command-line help private static void PrintHelp() { Console.WriteLine("\nUsage: SQSUpdateQueue -q queue_url [-a attribute -v value]"); Console.WriteLine(" -q: The URL of the queue you want to update."); Console.WriteLine(" -a: The name of the attribute to update."); Console.WriteLine(" -v, --value: The value to assign to the attribute."); } } // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = // 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); } } }

其他考量

  • 若要更新 RedrivePolicy 屬性,您必須根據您的作業系統,引用整個值並逸出鍵/值對的引號。

    例如,在 Windows 上, 值的建構方式類似如下:

    "{\"deadLetterTargetArn\":\"DEAD_LETTER-QUEUE-ARN\",\"maxReceiveCount\":\"10\"}"