【mq】RabbitMq批量删除队列

RabbitMq批量删除队列

​ 由于部分公司同事使用RabbitMq时,没有将Client设置为autodelete,导致大量冗余队列。其中这些队列又是无routekey队列,收到了批量的订阅消息,占用服务器内存。

​ 如何将这些无用的队列删除成为一个问题?经过多次摸索,在rabbitmq management api里面找到了方案:

using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;

class Program
{
    static async Task Main()
    {
        string rabbitMQBaseUrl = "https://your_url"; // Replace with your RabbitMQ management interface URL
        string vhost = ""; // Replace with the vhost you want to remove queues from
        string username = ""; // Replace with your RabbitMQ username
        string password = ""; // Replace with your RabbitMQ password

        // Get a list of queues in the vhost
        var queues = await GetQueuesAsync(rabbitMQBaseUrl, vhost, username, password);

        // Delete each queue
        foreach (var queue in queues)
        {
            await DeleteQueueAsync(rabbitMQBaseUrl, vhost, username, password, queue);
        }

        Console.WriteLine("All queues deleted successfully.");
    }

    static async Task<string[]> GetQueuesAsync(string baseUrl, string vhost, string username, string password)
    {
        using (var httpClient = new HttpClient())
        {
            var byteArray = Encoding.ASCII.GetBytes($"{username}:{password}");
            httpClient.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

            var response = await httpClient.GetStringAsync($"{baseUrl}/api/queues/{Uri.EscapeDataString(vhost)}");

            // Parse the JSON response using Newtonsoft.Json
            var queueList = JsonConvert.DeserializeObject<QueueInfo[]>(response);

            // Extract queue names from the parsed response
            var queueNames = queueList.Select(queueInfo => queueInfo.Name).ToArray();

            return queueNames;
        }
    }

    static async Task DeleteQueueAsync(string baseUrl, string vhost, string username, string password, string queue)
    {
        using (var httpClient = new HttpClient())
        {
            var byteArray = Encoding.ASCII.GetBytes($"{username}:{password}");
            httpClient.DefaultRequestHeaders.Authorization =
                new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

            await httpClient.DeleteAsync(
                $"{baseUrl}/api/queues/{Uri.EscapeDataString(vhost)}/{Uri.EscapeDataString(queue)}");
        }
    }
}

// Define a class to represent the structure of the QueueInfo received from the API
public class QueueInfo
{
    public string Name { get; set; }
    // Add other properties if needed
}
posted @ 2024-01-23 10:00  野菊花  阅读(740)  评论(0编辑  收藏  举报