2017-05-13 21 views
0

我試圖強制RabbitMQ隊列在Rabbit服務重新啓動時生存,同時迫使它們在服務重新啓動完成後重新使用相同的名稱。MassTransit和RabbitMQ,使隊列在使用DI重新啓動時生存

我們正在利用我們的DI容器傳遞消息的消費者

return new List<Type> 
{ 
    typeof(Consumer1), typeof(Consumer2), typeof(Consumer3), typeof(Consumer4) 
}; 

該集合,然後通過

t => _kernel.Get(t)); 

,然後傳遞到配置註冊他們這樣

cfg.ReceiveEndpoint(host, e => 
{ 
    foreach (var type in consumerTypes) 
    { 
     e.Consumer(type, getConsumer); 
    } 
}); 

這使得在每次重新啓動時都會重新創建隊列,名稱中帶有一個GUID。

如果我們試着這樣做:

cfg.ReceiveEndpoint(host, e => 
{ 
    foreach (var type in consumerTypes) 
    { 
     e.Consumer(type, getConsumer); 
     e.Durable = true; 
     e.AutoDelete = false; 
    } 
}); 

那麼隊列是持久的,但在服務重新啓動不創建。

我們如何爲每個消費者指定一個隊列名稱?

+0

隊列的每個端點創建。沒有什麼能阻止你爲每個消費者提供一個端點什麼是你的容器? MassTransit幾乎支持所有存在的容器。 –

+0

正確。我們正在使用Unity,我們想創建一個名爲server1name_MessageType1,server1name_MessageType2,server2name_MessageType1,server2name_MessageType2的隊列,並且使得隊列不會被刪除並允許它們存儲消息,直到它們是消費者爲止。 – MaPi

+0

接收端點隊列,交換和綁定永遠不會被刪除。我假設你明白了我的意思,看你的答案。 –

回答

0

解決這樣:

foreach (var type in consumerTypes) 
{ 
    var consumerType = type; 
    var queueName = string.Format("{0}_{1}", 
     Environment.MachineName, consumerType.ToString()); 
    cfg.ReceiveEndpoint(host, queueName, 
     e => 
     { 
      e.Consumer(consumerType, getConsumer); 
     }); 
}