2017-05-13 1 views
0

Ich versuche zu zwingen, die RabbitMQ-Warteschlangen den Rabbit-Dienst-Neustart zu überleben, während sie den gleichen Namen nach dem Neustart des Dienstes erneut verwenden erforderlich ist.MassTransit und RabbitMQ, make Warteschlange überleben Neustart bei Verwendung von DI

Wir verwenden unsere DI-Container die Nachricht Verbraucher

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

Diese Sammlung dann in die Konfigurations über

t => _kernel.Get(t)); 

Und dann sie übergeben wird passieren auf diese Weise Registrierung

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

Dadurch wird die Warteschlange bei jedem Neustart mit einer GUID im Namen neu erstellt.

Wenn wir versuchen, dies zu tun:

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

Dann ist die Warteschlange dauerhaft, ist aber nicht auf Service Neustart erstellt.

Wie können wir einen Warteschlangennamen für jeden Verbraucher angeben?

+0

Queues pro Endpunkt erstellt. Nichts hält Sie davon ab, einen Endpunkt pro Verbraucher zu haben. Was ist dein Behälter? MassTransit unterstützt fast alle vorhandenen Container. –

+0

Korrigieren. Wir verwenden Unity, wir möchten Warteschlangen erstellen, die sie server1name_MessageType1, server1_name_MeldungType2, server2_name_MessageType1, server2_name_MeldungType2 heißen und dafür sorgen, dass die Warteschlangen nicht gelöscht werden und ihnen erlauben, die Nachrichten zu speichern, bis sie Consumer sind. – MaPi

+0

Empfangene Endpunktwarteschlangen, Austausch und Bindungen werden niemals gelöscht . Ich vermute, du hast herausgefunden, was ich meinte, und deine Antwort angesehen. –

Antwort

0

Gelöst dies zu tun:

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); 
     }); 
} 
Verwandte Themen