2017-01-30 6 views
1

Я использую RabbitMQ для ежедневных транзакций. Мои потребители - это настольные приложения .Net, развернутые на нескольких компьютерах. Каждый день транзакции переносятся в очередь только в течение определенного времени. Кроме того, для любой новой транзакции должна быть сложная остановка. Мне удалось прекратить отправку новой транзакции в очередь. Тем не менее, существующие транзакции в очереди также необходимо очистить, чтобы они не были отправлены ни одному пользователю. я попытался найти это, но не получил никакого решения для очистки очереди, за исключением двух options-Очистить очередь в RabbitMQ

  • Удалить и заново создать очередь каждый день
  • Остановить все потребители очереди

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

+0

Вы пытались использовать эту функцию: https://www.rabbitmq.com/ttl.html –

+0

Спасибо Я проверить это. –

+0

У вас есть функция в 'rabbitmqadmin' для очистки очередей,' quebitmqadmin purge queue name = queue_name'. Несмотря на то, что это не было бы изощренно сделано в вашей базе кода, это означало бы, что вам не нужно удалять очереди или останавливать потребителей. –

ответ

2

В C# вы можете очистить Очереди как этот

  ConnectionFactory factory = new ConnectionFactory(); 

      factory.HostName = "localhost"; 
      factory.UserName = "guest"; 
      factory.Password = "guest"; 

      using (var connection = factory.CreateConnection()) 
      { 
       using (var channel = connection.CreateModel()) 
       { 
        channel.QueuePurge(queueName); 
       } 

      } 
0

Если это должен быть один из этих двух подходов, а вы need to do this in C# somehow, как вы сказали в комментариях, то просто use the HTTP API. Найдите на этой странице /api/queues/vhost/name/contents, и вы можете вызвать метод удаления.

+0

Что бы удалить очередь, я думаю? –

+0

Да. Я не вставлял правильный путь - в конце отсутствует содержимое. Я отредактирую ответ – cantSleepNow

+0

mountain traveler aslo дал эту информацию как ответ на мой ответ – cantSleepNow

0

Еще более конкретно, от HTTP API: глагола Http УДАЛИТЬ на /api/queues/vhost/name/contents Цитата

: «. Содержание очереди DELETE для очистки Примечание Вы не можете получить это.»

2

В этом blog article описано, как очистить очередь в RabbitMQ различными способами.

rabbitmqadmin: управлении плагин поставляется с инструментом командной строки, rabbitmqadmin, которые могут выполнять те же действия, что и веб-интерфейс (интерфейс управления RabbitMQ).

Скрипт используется для очистки всех сообщений в одной очереди является:

$ rabbitmqadmin purge queue name=name_of_queue 

HTTP API: Плагин RabbitMQ Management обеспечивает HTTP на основе API для управления и мониторинга вашего RabbitMQ сервера.

curl -i -XDELETE https://USERNAME:[email protected]/api/queues/vhost/QUEUE_NAME/contents 

Политика: Добавить политику, которая соответствует имена очередей с правилом макс-длина. Политику можно добавить, введя интерфейс управления, а затем нажав вкладку admin. (Не забудьте удалить политику после ее применения.)

+0

Извините, у меня нет RabbitMQAdmin, поэтому пришлось делать это через код. –

0

Основываясь на предложении Энди Скирроу (в комментариях), я установил «истечение» для каждого сообщения, прежде чем отправлять его в RabbitMQ в JSON полезная нагрузка.

Моего код-

using (System.Net.WebClient client = new System.Net.WebClient()) 
{ 
    client.Credentials = new System.Net.NetworkCredential(rmq_user, rmq_pass); 
    client.Headers.Set("Content-Type", "application/json"); 
    response = client.UploadString(messagePath, jsonPayload); 
} 

Вот мой payload-

{"payload":"{\"PerformAutomation\":{\"AutomationInputDictionary\":{\"Search.Ban\":\"Holidays from=10th Mar 2017;Holidays to=13th Mar 2017;WalmartID=00155628;ticket_number=1226004;TicketType=HOLIDAY REQUEST;RawTicketData=PERN: 00155628\\r\\nHoliday Request -------------------- Holiday from 10th Mar 2017 to 13th Mar 2017\"},\"ProcessName\":\"HRProc\",\"ProfileName\":\"HR\",\"APIVersion\":\"\",\"AppId\":\"\",\"CommandExecutionWindow\":\"\",\"CommandGenerationSource\":\"\",\"Country\":\"\",\"Instance\":\"\",\"PartnerId\":\"\",\"ReferenceCode\":\"\",\"Timestamp\":\"5:07 AM\",\"UserName\":\"svcblpr\",\"VID\":\"\"}}","content_type":"string","content_encoding":"test/json","profile":"HR","expiration":604800000,"app_id":"wm_uc1_load_gen_app","source_message_id":"wm_uc1_load_gen_source","header":null} 

Так с этим обходным путем я не должен очистить очередь как сообщения будут автоматически удалены на основании истечения срока (значение миллисекунд), заданное в полезной нагрузке.