Frage

Wir haben eine TIBCO EMS-Lösung, die Server-Failover in einer 2-4-Server-Umgebung-in gebaut verwendet. Wenn die TIBCO admins Failover-Dienste von einem Server auf einem anderen EMS, Verbindungen sollen bei den EMS-Service-Level automatisch auf den neuen Server übertragen werden. Für unser C # -Anwendungen den EMS-Dienst, wird dies nicht geschieht - unsere Benutzerverbindungen sind nicht auf den neuen Server nach einem Failover übertragen werden und wir sind nicht sicher, warum

.

Unsere Anwendungsverbindung beim Start EMS nur dann, wenn der TIBCO admins Failover nachdem Benutzer unsere Anwendung gestartet hat, sie müssen Benutzer die App neu starten, um auf den neuen Server (unsere EMS-Verbindung verwendet einen Server-String einschließlich alle 4 wieder angeschlossen EMS-Server Produktion -. wenn der erste Versuch fehlschlägt, geht es weiter zu dem nächsten Server im String und versucht es erneut)

Ich suche nach einem automatisierten Ansatz, der zu EMS in regelmäßigen Abständen wieder versucht, wenn es erkennt, dass die Verbindung tot ist, aber ich bin nicht sicher, wie man am besten, das zu tun.

Irgendwelche Ideen? Wir verwenden TIBCO.EMS.dll Version 4.4.2 und .Net 2.x (Smart Client app)

Jede mögliche Hilfe würde geschätzt.

War es hilfreich?

Lösung

Dieser Beitrag soll meine aktuellen Kommentare zusammenzuzufassen und meinen Ansatz erklärt im Detail ...

Die TIBCO ConnectionFactory- 'und ‚Verbindung‘ Typen sind Schwergewicht, Thread-sicher-Typ. TIBCO schlägt vor, dass Sie die Verwendung von ein ConnectionFactory- (pro Server konfiguriert Fabrik) und ein Verbindung pro Fabrik erhalten.

Der Server auch erscheint verantwortlich zu sein für in-place ‚Verbindung‘ Failover und Wiederverbindung, also lassen Sie uns bestätigen Sie es seine Aufgabe tut und dann lehnen diese Funktion.

Erstellen einer Client-Seite Lösung wird etwas mehr beteiligt sein, als ein Server oder Client-Setup-Problem zu beheben. Alle Sitzungen, die Sie von einer gescheiterten Verbindung erstellt haben, müssen neu erstellt werden (nicht zu erwähnen, Erzeuger, Verbraucher und Ziele). Es gibt keine „verbinden“ oder „refresh“ Methoden auf jede Art. Die Sitzungen nicht einen Verweis auf ihre Mutter Verbindung aufrechterhalten entweder.

Sie müssen einen Nachschlag von Verbindungs- / Sitzungsobjekte verwalten und gehen Nüsse Reinitialisierung alle! oder irgendeine Art von Sitzung Ausfall Ereignishandler implementieren, die die neue Verbindung bekommen und wieder sie.

So, jetzt wollen wir graben und sehen, ob die Client-Setup-Failover-Benachrichtigung zu erhalten ist (tib ems Benutzer Führung pg 292). Und stellen Sie sicher, dass die erhöhte Ausnahme abgefangen wird, enthält die Failover-URL und richtig behandelt wird.

Andere Tipps

Zunächst einmal, ja, ich meine eigene Frage bin zu beantworten. Es ist wichtig zu beachten Sie jedoch, dass ohne ajmastrean, würde ich nirgendwo sein. vielen Dank!

ONE: ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay sollte SetReconnAttemptTimeout entsprechend eingestellt werden. Ich denke, dass die Standardwerte erneut versuchen, zu schnell (in der Größenordnung von 1/2 Sekunde zwischen zwei Wiederholungen). Unser EMS-Server kann eine lange Zeit in Anspruch nehmen, da dem Netzwerkspeichers Failover usw. -. So 5 Wiederholungen bei 1 / 2s-Wechsel bei weitem nicht lang genug sind,

TWO: Ich glaube, es ist wichtig, die Client-Server- und Server-Client-Herzschläge zu ermöglichen. War nicht in der Lage zu überprüfen, aber ohne die Benachrichtigung erhält möglicherweise nicht der Kunde diejenigen vorhanden, dass der Server offline ist oder in Failover-Modus umgeschaltet wird. Das ist natürlich, ist eine serverseitige Einstellung für EMS.

DREI: Sie können durch das Setzen Tibems.SetExceptionOnFTSwitch (true) für Failover-Ereignis beobachten; und Verdrahtung bis dann eine Ausnahme Event-Handler. Wenn in einer Umgebung mit einem einzelnen Server, werden Sie eine siehe „Verbindung wurde beendet“ -Meldung. wenn Sie in einer fehlertoleranten Multi-Server-Umgebung sind jedoch, sehen Sie dies: „Connection hat fehlertoleranten Switch ausgeführt“. Sie müssen nicht unbedingt diese Benachrichtigung benötigen, aber es kann nützlich sein (vor allem bei der Prüfung).

FOUR: Offenbar nicht klar in der EMS-Dokumentation, Verbindung Reconnect funktioniert NICHT in einer Single-Server-Umgebung. Sie müssen in einer Multi-Server, fehlertolerante Umgebung sein. Es gibt einen Trick, aber. Sie können den gleichen Server in der Verbindungsliste setzen zweimal -. Seltsam ich weiß, aber es funktioniert und es ermöglicht die eingebaute in Reconnect Logik arbeiten

einige Code:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}

Client-Anwendungen Anmeldung eines Failover durch Setzen der tibco.tibjms.ft.switch.exception Systemeigenschaft erhalten können

Vielleicht muss die Bibliothek das funktionieren?

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