Frage

Wir verwenden TIBCO EMS unserer ASP.NET 3.5 app für eine Schnittstelle zu einem externen System, und es scheint ganz gut zu funktionieren - außer, dass die Jungs auf der anderen Seite läuft sagt uns, wir sammele Verbindungen wie verrückt und nie schließen sie ....

Was ich tue, ist das Routing all TIBCO Verkehrs über eine einzige Klasse mit statischen Membervariablen sowohl für die TIBCO ConnectionFactory und die Connection selbst gesagt hat, dass sie den Bau ziemlich ressourcen- und zeitintensiv:

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;
     }
 }

Nun meine Mühe ist: Wo und wie kann ich

  • sagen die TIBCO Verbindung zu "auto-close", wenn nicht mehr benötigt werden (wie bei der SqlConnection)
  • in der Nähe der TIBCO-Verbindung auf einem Fehler
  • in der Nähe der TIBCO-Verbindung vor unserer ASP.NET app beendet (oder dem Benutzer abmeldet)

Ich scheine nicht wirklich viele nützliche Informationen zu finden, wie TIBCO EMS aus der C # / .NET-Welt nutzen ...... alle Abnehmer ?? Dank !!

War es hilfreich?

Lösung

Erstens, ich verstehe nicht, wie man aus Verbindungen ausgeführt werden kann. Da Sie die Verbindung in der Anwendung sind zu speichern, sollten Sie nur eine einzige Verbindung für die gesamte Anwendung haben IIS.

Das auf der Seite legen, würde ich Folgendes tun:

  • Wenn die Verbindung abgerufen wird, stellt die Verbindung, wie Sie jetzt tun;
  • Nachdem Sie die Verbindung erstellt haben, Spin-up einem Hintergrund-Thread;
  • Set ein DateTime zu DateTime.Now;
  • Lassen Sie den Hintergrund zu überprüfen (zum Beispiel jede Sekunde oder alle 10 Sekunden), was der Unterschied zwischen dem Zeitpunkt ist, dass Sie festgelegt haben und DateTime.Now. Wenn das länger als eine bestimmte Zeitüberschreitung, tötet die Verbindung und Satz Application["EMSConnectionFactory"] auf null;
  • Wenn der Hintergrund-Thread tötet die Verbindung, in der Nähe des Hintergrund-Thread;
  • Jedes Mal, wenn die Verbindung angefordert wird, setzen Sie den DateTimetoDateTime.Now`.

Auf diese Weise sollten die Verbindungen automatisch geschlossen werden.

Beachten Sie, dass Sie Verriegelung einführen müssen. Sie können Application.Lock() und Application.Unlock() für diese.

In Bezug auf Schließen auf einem Fehler: Ich sehe, dass Sie einen Exception-Handler auf die Verbindungsinstanz angehängt haben. Können Sie nicht die Verbindung mit, dass in der Nähe?

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