Question

Nous utilisons TIBCO EMS de notre application ASP.NET 3.5 pour une interface à un système externe, et il semble fonctionner très bien - sauf que les gars en cours d'exécution de l'autre côté nous dit que nous sommes récoltant des connexions comme fou et jamais les fermer ....

Ce que je fais est de routage tout le trafic TIBCO par une seule classe avec des variables membres statiques pour les deux TIBCO ConnectionFactory et le Connection lui-même, ayant été dit que leur construction est assez de ressources et de temps à forte intensité:

private static ConnectionFactory Factory
{
    get
    {
        if (HttpContext.Current.Application["EMSConnectionFactory"] == null)
        {
           ConnectionFactory connectionFactory = CreateTibcoFactory();
           HttpContext.Current.Application["EMSConnectionFactory"] = connectionFactory;
        }

        return HttpContext.Current.Application["EMSConnectionFactory"] as ConnectionFactory;
    }
}

private static Connection EMSConnection
{
    get
    {
        if (HttpContext.Current.Application["EMSConnection"] == null)
        {
           Connection connection = Factory.CreateConnection(*username*,  *password*);
           connection.ExceptionHandler += new EMSExceptionHandler(TibcoConnectionExceptionHandler);
           connection.Start();
           HttpContext.Current.Application["EMSConnection"] = connection;
        }

        return HttpContext.Current.Application["EMSConnection"] as Connection;
     }
 }

Maintenant, mon problème est: où et comment pourrais-je

  • dire la connexion TIBCO à « fermeture automatique » lorsqu'ils ne sont plus nécessaires (comme avec le SqlConnection)
  • fermer la connexion TIBCO sur une erreur
  • fermer la connexion TIBCO avant nos finitions d'applications ASP.NET (ou l'utilisateur se connecte au large)

Je ne semble pas vraiment trouver beaucoup d'informations utiles sur la façon d'utiliser TIBCO EMS du monde C # / .NET ...... ?? preneur Merci !!

Était-ce utile?

La solution

Tout d'abord, je ne comprends pas comment vous pourriez être à court de connexions. Puisque vous stockez la connexion dans l'application, vous ne devriez avoir une connexion unique pour l'ensemble de IIS application.

qui a mis de côté, je procédez comme suit:

  • Lorsque la connexion est récupérée, créez la connexion que vous faites maintenant;
  • Une fois que vous avez créé la connexion, un fil de spin de fond;
  • Définir un DateTime à DateTime.Now;
  • Laissez la vérification des antécédents (par exemple tous les deux ou toutes les 10 secondes) quelle est la différence entre la date que vous avez défini et DateTime.Now. Si c'est plus long qu'un délai d'attente spécifique, tuer la connexion et ensemble Application["EMSConnectionFactory"] null;
  • Lorsque le fil de fond tue la connexion, à proximité du fil de fond;
  • Chaque fois que la connexion se demande, réinitialiser le DateTimetoDateTime.Now`.

De cette façon, les connexions doit être fermé automatiquement.

Notez que vous devrez introduire le verrouillage. Vous pouvez utiliser pour ce Application.Lock() et Application.Unlock().

En ce qui concerne la fermeture d'une erreur: Je vois que vous avez joint un gestionnaire d'exception à l'instance de connexion. Tu ne peux pas fermer la connexion avec cela?

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