Question

Nous avons une solution TIBCO EMS qui utilise le basculement de serveur intégré dans un environnement de serveur 2-4. Si TIBCO gère les services de basculement d'un serveur EMS à un autre, les connexions sont censées être transférées automatiquement vers le nouveau serveur au niveau du service EMS. Cela ne se produit pas pour nos applications C # utilisant le service EMS - nos connexions utilisateur ne sont pas transférées vers le nouveau serveur après le basculement et nous ne savons pas pourquoi.

Notre connexion d’application à EMS au démarrage uniquement. Par conséquent, si TIBCO admet le basculement après le démarrage de l’application, il doit redémarrer l’application pour se reconnecter au nouveau serveur (notre connexion EMS utilise une chaîne de serveurs EMS de production - si la première tentative échoue, il passe au serveur suivant de la chaîne et tente à nouveau).

Je recherche une approche automatisée qui tente de se reconnecter périodiquement à EMS s'il détecte que la connexion est morte, mais je ne sais pas comment faire au mieux.

Des idées? Nous utilisons TIBCO.EMS.dll version 4.4.2 et .Net 2.x (application SmartClient)

Toute aide serait appréciée.

Était-ce utile?

La solution

Cet article devrait résumer mes commentaires actuels et expliquer mon approche plus en détail ...

Les types 'ConnectionFactory' et 'Connection' de TIBCO sont des types de poids lourds sécurisés pour les threads. TIBCO vous suggère de conserver une ConnectionFactory (par fabrique configurée par serveur) et une connexion par fabrique.

Le serveur apparaît également comme responsable du basculement et de la reconnexion de "connexion" sur place. Nous allons donc confirmer qu'il fait son travail, puis nous appuyer sur cette fonctionnalité.

La création d'une solution côté client sera légèrement plus complexe que la résolution d'un problème d'installation du serveur ou du client. Toutes les sessions que vous avez créées à partir d'une connexion en échec doivent être recréées (sans parler des producteurs, des consommateurs et des destinations). Il n'y a pas de "reconnexion". ou " rafraîchir " méthodes sur l'un ou l'autre type. Les sessions ne conservent pas non plus de référence à leur connexion parent.

Vous devrez gérer la recherche des objets de connexion / session et foncer pour réinitialiser tout le monde! ou implémentez une sorte de gestionnaire d’événement d’échec de session pouvant obtenir la nouvelle connexion et les reconnecter.

Donc, pour l'instant, essayons de voir si le client est configuré pour recevoir une notification de basculement (Guide de l'utilisateur de tib ems, page 292). Assurez-vous également que l'exception déclenchée est interceptée, contient l'URL de basculement et est gérée correctement.

Autres conseils

Tout d’abord, oui, je réponds à ma propre question. Il est important de noter, cependant, que sans ajmastrean, je ne serais nulle part. merci beaucoup!

ONE: ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout doivent être définies correctement. Je pense que les valeurs par défaut réessayent trop rapidement (de l'ordre de 1/2 seconde entre les tentatives). Le basculement de nos serveurs EMS peut prendre beaucoup de temps à cause du stockage réseau, etc. - 5 tentatives à intervalles de 1 / 2s ne suffisent donc pas assez longtemps.

DEUX: Je pense qu'il est important d'activer les pulsations client-serveur et serveur-client. N'a pas pu vérifier, mais sans ces éléments en place, le client pourrait ne pas recevoir la notification que le serveur est hors ligne ou basculer en mode de basculement. Ceci, bien sûr, est un paramètre côté serveur pour EMS.

TROIS: vous pouvez surveiller les événements de basculement en définissant Tibems.SetExceptionOnFTSwitch (true); puis en connectant un gestionnaire d'événements d'exception. Dans un environnement à serveur unique, vous verrez une "Connexion interrompue". message. Toutefois, si vous vous trouvez dans un environnement multiserveur tolérant aux pannes, vous verrez ceci: "La connexion a effectué le basculement du système à tolérance de pannes sur". Vous n’avez pas strictement besoin de cette notification, mais elle peut être utile (notamment lors des tests).

QUATRE: Apparemment pas clairement dans la documentation EMS, la reconnexion de connexion NE fonctionnera PAS dans un environnement à serveur unique. Vous devez être dans un environnement multiserveur tolérant aux pannes. Il y a un truc, cependant. Vous pouvez mettre le même serveur deux fois dans la liste des connexions - curieux que je sache, mais cela fonctionne et permet à la logique de reconnexion intégrée de fonctionner.

du 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());
}

Les applications clientes peuvent recevoir une notification de basculement en définissant la propriété système tibco.tibjms.ft.switch.exception

Peut-être que la bibliothèque a besoin de ça pour fonctionner?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top