2016-06-09 7 views
1
verbunden

Mit RabbitMQ mit einem Cluster von Knoten, habe ich meine Fabrik und die Verbindung wie folgt auf (die .NET-Client):Wie sehen, welche Host wir

var factory = new ConnectionFactory() 
{ 
    UserName = Properties.Settings.Default.RabbitMQUser, 
    Password = Properties.Settings.Default.RabbitMQPassword, 
    HostnameSelector = new RandomHostNameSelector(), 
    AutomaticRecoveryEnabled = true 
}; 
connection = factory.CreateConnection(Properties.Settings.Default.RabbitMQServers.Split(';')); 

Wo Properties.Settings.Default.RabbitMQServers eine halb- verwenden Doppelpunkt getrennte Liste von Servern:

clust01;clust02;clust03 

nach dem Anschließen ist es eine Möglichkeit, die Host es tatsächlich aufgenommen, um zu sehen und ist es eine Möglichkeit zu erkennen, wenn das könnte (ändern, weil der bestimmte Knoten abgestürzt ist, wurde gestoppt, oder neu gestartet)? factory.HostName gibt einfach localhost zurück.

Bearbeiten: Es scheint connection.Endpoint.HostName gibt Ihnen den tatsächlichen Hostnamen als @Evk und @Wally haben beide angegeben (danke). Aber gibt es eine Möglichkeit, eine Veränderung zu erkennen? Es scheint, dass IConnection hat eine ConnectionShutdown Ereignis, das Ich denke, könnte als Teil der Vermittlung von Hosts aufgerufen werden, aber es gibt keine entsprechende Start-oder Neustart-Ereignis (so nehme ich an, es würde den neuen Host noch nicht kennen) . Es gibt auch ConnectionBlocked und ConnectionUnblocked Ereignisse, aber sie sind undokumentiert, also habe ich keine Ahnung, was sie tun ...

+2

Ich nehme an, connection.Endpoint.HostName enthält, was Sie wollen? – Evk

+0

@Evk - Du hast gepostet, während ich meine eigene Antwort eintippte. Ich denke du hast die richtige Antwort - aber ich kann es nicht testen. – wally

Antwort

2

Wie Hostnamen zu bekommen gefunden Sie bereits aus, wie für So erkennen Sie, wenn es sich ändert: Wenn Sie AutomaticRecoveryEnabled für Ihre Fabrik einstellen, gibt CreateConnection wirklich die Instanz AutorecoveringConnection zurück. Diese Klasse implementiert die spezielle Schnittstelle IRecoverable, für die Sie ein Ereignis benötigen. Um zu erkennen, wenn automatische Wiederherstellung geschieht, abonnieren Sie es wie folgt:

var connection = factory.CreateConnection(); 
((IRecoverable)connection).Recovery += (sender, args) => 
{ 
    // recovery happened 
}; 
+0

Tolles Zeug - ja das scheint zu funktionieren. Seltsamerweise scheint es, dass es den Selektor nicht das erste Mal aufruft. Es verbindet sich immer nur mit dem letzten Knoten in meiner Liste der Hosts. Aber wenn ich diesen Knoten herunter nehme, scheint er in der Lage zu sein, sich mit einem anderen Knoten zu verbinden und den Hostnamen zu aktualisieren. –

+0

@MattBurland Ja, wenn Quellcode betrachtet wird, wird HostnameSelector nur für reguläre (nicht wiederherstellbare) Verbindungen verwendet. Für wiederherstellbare es immer nur die letzte. Sie können einfach Ihre eigene Zufallsauswahllogik implementieren und den bevorzugten Hostnamen zuletzt angeben. – Evk

1

Ich habe keine Umgebung, in der ich das testen kann, also könnte es völlig falsch sein.

Es sieht wie Sie die endpoint des connection-Objekt verwenden kann (IConnection) zurückgegeben:

(string) connection.Endpoint.HostName 

Cite: https://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.4.0/rabbitmq-dotnet-client-1.4.0-net-2.0-htmldoc/type-RabbitMQ.Client.IConnection.html

+0

Dies ist korrekt, um den Hostnamen zu erhalten, aber gibt es eine Möglichkeit zu erkennen, ob und wann es sich ändert? –

+0

Ich bin nicht bewusst, dass die RabbitMQ (ich habe mit PHP und Python gearbeitet, und nur vor kurzem C#) "offiziellen" Bibliotheken solche Fail-Over durchführen. Ich würde erwarten, dass es dokumentiert wird, wenn es tut (und ich kann nicht sehen, wo ich es erwarten würde: https://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v3.6.2 /rabbitmq-dotnet-client-3.6.2-client-htmldoc/html/type-RabbitMQ.Client.IHostnameSelector.html) – wally