2017-01-30 61 views
1

我使用RabbitMQ的日常事務清除一個隊列。我的消費者是部署在多臺機器上的.Net桌面應用程序。每天只有在一定時間內將交易推到隊列中。除此之外,任何新的交易都需要努力。我設法停止向隊列發送新事務。然而,在隊列中的現有交易還需要被刷新,以便它不會被髮送到任何消費者。 我試圖尋找這一點,但沒有得到任何解決方案用於清除隊列除了兩個選項 -在RabbitMQ的

  • 刪除並每天重新創建隊列
  • 停止隊列的所有消費者

這兩種方法都可以實現,但它需要在我的系統的變化顯著量。我想知道是否有更好的方法。

+0

您是否嘗試過使用此功能:https://www.rabbitmq.com/ttl.html –

+0

謝謝,我會檢查了這一點。 –

+0

你有'rabbitmqadmin'中的一個特性來清除隊列,'rabbitmqadmin 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

山地旅行者aslo給出了這個信息作爲我的答案的答案 – cantSleepNow

0

更具體,從HTTP API:HTTP謂詞刪除/api/queues/vhost/name/contents

引用:「隊列的內容刪除清除注意你不能得到這一點。」

2

blog article介紹瞭如何清除在RabbitMQ的隊列中以不同的方式。

rabbitmqadmin: 管理插件附帶一個命令行工具,rabbitmqadmin,可以執行相同的操作的基於web的用戶界面(該RabbitMQ的管理接口)。

用來清除在一個單一的隊列中的所有消息中的腳本是:

$ rabbitmqadmin purge queue name=name_of_queue 

HTTP API:的RabbitMQ的管理插件提供了您的RabbitMQ服務器的管理和監控的基於HTTP的API。

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

政策: 添加隊列名稱以MAX-lenght規則相匹配的政策。策略可以通過進入管理界面,然後按管理選項卡中添加。 (不要忘記在應用後刪除策略。)

+0

對不起,我沒有RabbitMQAdmin所以必須通過代碼來完成。 –

0

根據Andy Skirrow的建議(在評論中),我已經爲每條消息設置了「過期」,然後將其發佈到JSON中的RabbitMQ有效載荷。

我的代碼 -

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} 

所以用這個解決辦法我不必清除隊列的消息會自動根據到期被刪除(毫秒值)設置在有效載荷中。