Frage

Ich habe ein einfaches Pub-Sub-Setup in einem mittelgroßen Netzwerk mit ZMQ 2.1. Obwohl einige Abonnenten C# -Bindungen verwenden, verwenden andere Python -Bindungen, und das Problem, das ich habe, ist für beide gleich.

Wenn ich das Netzwerkkabel von einem Maschine ziehe, der einen Abonnenten ausführt, erhalte ich einen nicht fehlenden Fehler, der diesen Abonnenten sofort beendet.

Hier ist ein sehr einfaches Beispiel für einen Abonnenten in Python (nicht der tatsächliche Produktionscode, aber genug, um das Problem zu reproduzieren):

import zmq

def main(server_address, port):

    context = zmq.Context()
    sub_socket = context.socket(zmq.SUB)
    sub_socket.connect("tcp://" + server_address + ":" + str(port))
    sub_socket.setsockopt(zmq.SUBSCRIBE, "KITH1S2")

    while True:

        msg = sub_socket.recv()      
        print msg  

if __name__ == "__main__": main("company-intranet", 4000)

In C# endet das Programm einfach lautlos. In Python bekomme ich zumindest Folgendes:

Behauptung fehlgeschlagen: rc == 0 (.... src zmq_connector.cpp: 48)

Diese Anwendung hat die Laufzeit auf ungewöhnliche Weise beantragt. Bitte wenden Sie sich an das Support -Team der Anwendung, um weitere Informationen zu erhalten.

Ich habe nicht blockierende Versionen und Poller-Versionen ausprobiert, aber in beiden Fällen bleibt dieses sofortige Beendigungsproblem bestehen. Gibt es etwas Offensichtliches? Ich sollte Tun, aber ich bin nicht? (Das ist offensichtlich für jemand anderen :)).

BEARBEITEN:

Fand die folgenden: https://zeromq.jira.com/browse/libzmq-207

Es scheint, als wäre es ein bekanntes Problem.

Dieser Link Links zu GitHub, wobei ein Änderungsprotokoll für 2.1.10 folgende Anmerkung hat:

  • Behobene Ausgabe 207, Behauptungsfehler in zmq_connecter.cpp: 48, wenn eine ungültige ZMQ_CONNECT () -Sziel verwendet wurde oder der Hostname nicht behoben werden konnte. Der Anruf zmq_connect () gibt jetzt in beiden Fällen -1 zurück.

Obwohl verbinden() Wirft in der Tat eine ungültige Argument -Ausnahme in Python (anscheinend nicht C#?). recv () scheitert immer noch. Wenn die Abonnentenmaschine plötzlich das Netzwerk verliert, wird dieser Abonnent einfach nicht mehr funktionieren.

Also - ich werde versuchen, IP -Adressen anstelle von benannten Adressen zu verwenden, um festzustellen, ob dies das Problem umgeht. Nicht ideal, aber besser als Insta-Crash.

War es hilfreich?

Lösung

Originalfrage: Gibt es etwas Offensichtliches, das ich tun sollte, aber ich bin nicht?

Nein.

Die Problemumgehung besteht vorerst darin, die IP -Adressierung zu verwenden. Dies führt nicht zu einem Programmfehler bei Netzwerkunterbrechung für ZMQ 2.1.x.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top