Лучший способ удалить сообщения из SQS во время разработки - PullRequest
18 голосов
/ 10 октября 2011

Во время разработки я генерирую много поддельных сообщений на своем Amazon SQS. Я собирался написать крошечное приложение для удаления всех сообщений (что я часто делаю во время разработки). Кто-нибудь знает инструмент для очистки очереди?

Ответы [ 9 ]

45 голосов
/ 19 марта 2013

Если вы не хотите писать скрипт или удалять свою очередь.Вы можете изменить конфигурацию очереди:

  1. Щелкните правой кнопкой мыши очередь>> 1004 *
  2. Измените Message Retention period на 1 минуту (минимальное время, которое может быть установлено).*
  3. Подождите, пока все сообщения исчезнут.

Я обнаружил, что этот способ хорошо работает для удаления всех сообщений в очереди без удаления очереди.

9 голосов
/ 17 декабря 2014

По состоянию на декабрь 2014 года консоль sqs теперь имеет параметр очереди очистки в меню действий очереди.

7 голосов
/ 20 октября 2011

Для тех, кто пришел сюда, ищет способ массового удаления сообщений SQS в C # ...

//C# Console app which deletes all messages from a specified queue
//AWS .NET library required.

using System;
using System.Net;
using System.Configuration;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;

using Amazon;
using Amazon.SQS;
using Amazon.SQS.Model;
using System.Timers;

using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Diagnostics;

namespace QueueDeleter
{
    class Program
    {
        public static System.Timers.Timer myTimer;
        static NameValueCollection appConfig = ConfigurationManager.AppSettings;
        static string accessKeyID = appConfig["AWSAccessKey"];
        static string secretAccessKeyID = appConfig["AWSSecretKey"];
        static private AmazonSQS sqs;

        static string myQueueUrl = "https://queue.amazonaws.com/1640634564530223/myQueueUrl";
        public static String messageReceiptHandle;

        public static void Main(string[] args)
        {
            sqs = AWSClientFactory.CreateAmazonSQSClient(accessKeyID, secretAccessKeyID);

            myTimer = new System.Timers.Timer();
            myTimer.Interval = 10;
            myTimer.Elapsed += new ElapsedEventHandler(checkQueue);
            myTimer.AutoReset = true;
            myTimer.Start();
            Console.Read();
        }

        static void checkQueue(object source, ElapsedEventArgs e)
        {
            myTimer.Stop();

            ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
            receiveMessageRequest.QueueUrl = myQueueUrl;
            ReceiveMessageResponse receiveMessageResponse = sqs.ReceiveMessage(receiveMessageRequest);
            if (receiveMessageResponse.IsSetReceiveMessageResult())
            {
                ReceiveMessageResult receiveMessageResult = receiveMessageResponse.ReceiveMessageResult;

                if (receiveMessageResult.Message.Count < 1)
                {
                    Console.WriteLine("Can't find any visible messages.");
                    myTimer.Start();
                    return;
                }

            foreach (Message message in receiveMessageResult.Message)
            {
                Console.WriteLine("Printing received message.\n");

                messageReceiptHandle = message.ReceiptHandle;

                Console.WriteLine("Message Body:");
                if (message.IsSetBody())
                {
                    Console.WriteLine("    Body: {0}", message.Body);
                }
                sqs.DeleteMessage(new DeleteMessageRequest().WithQueueUrl(myQueueUrl).WithReceiptHandle(messageReceiptHandle));
            }
        }
        else
        {
            Console.WriteLine("No new messages.");
        }

         myTimer.Start();
        }
    }
}
6 голосов
/ 21 апреля 2014

Проверьте первый элемент в очереди. Прокрутите вниз до последнего элемента в очереди. Удерживая клавишу Shift, нажмите на элемент. Все будут выбраны.

4 голосов
/ 12 декабря 2011

Я думаю, что лучшим способом было бы удалить очередь и создать ее заново, всего 2 запроса.

1 голос
/ 04 ноября 2015

Вариант 1: у boto sqs есть метод purge_queue для python:

purge_queue(queue)
Purge all messages in an SQS Queue.

Parameters: queue (A Queue object) – The SQS queue to be purged
Return type:    bool
Returns:    True if the command succeeded, False otherwise

Источник: http://boto.readthedocs.org/en/latest/ref/sqs.html

Код, который работает для меня:

conn = boto.sqs.connect_to_region('us-east-1',
          aws_access_key_id=AWS_ACCESS_KEY_ID,
          aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)
q = conn.create_queue("blah")
#add some messages here

#invoke the purge_queue method of the conn, and pass in the
#queue to purge.
conn.purge_queue(self.queue)

Для меня это удалило очередь. Тем не менее, Amazon SQS позволяет запускать это только один раз каждые 60 секунд. Поэтому мне пришлось использовать вторичное решение ниже:

Вариант 2. Выполните очистку, используя все сообщения в цикле while и выбрасывая их:

    all_messages = []
    rs = self.queue.get_messages(10)
    while len(rs) > 0:
        all_messages.extend(rs)
        rs = self.queue.get_messages(10)
1 голос
/ 27 мая 2014

Я думаю, что лучший способ это изменить срок хранения до 1 минуты, но вот код Python, если кому-то нужно:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import boto.sqs
from boto.sqs.message import Message
import time
import os

startTime = program_start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())

### Lets connect to SQS:
qcon = boto.sqs.connect_to_region(region,aws_access_key_id='xxx',aws_secret_access_key='xxx')
SHQueue = qcon.get_queue('SQS')
m = Message()
### Read file and write to SQS
counter = 0
while counter < 1000:   ## For deleting 1000*10 items, change to True if you want delete all
    links = SHQueue.get_messages(10)
    for link in links:
            m = link
            SHQueue.delete_message(m)
    counter += 1
#### The End
print "\n\nTerminating...\n"
print "Start: ", program_start_time
print "End time: ", time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
0 голосов
/ 16 марта 2017
0 голосов
/ 21 февраля 2017

Если у вас есть доступ к консоли AWS, вы можете очистить очередь с помощью веб-интерфейса.

Шаги:

  • Перейдите к Сервисам ->SQS
  • Фильтрация очередей по имени "QUEUE_NAME"
  • Щелкните правой кнопкой мыши по имени своей очереди -> Очистить очередь

Это запросит очистку очереди иэто должно быть выполнено за 5 или 10 секунд или около того.

См. ниже, как выполнить эту операцию:

Purge queue manually

...