Domanda

Stiamo utilizzando TIBCO EMS dal nostro ASP.NET 3.5 app per un'unica interfaccia ad un sistema esterno, e sembra funzionare bene - tranne che i ragazzi che gestiscono l'altro lato ci dice che stiamo raccogliendo i collegamenti come folle e mai chiuderli ....

Quello che sto facendo è di routing di tutto il traffico TIBCO tramite una singola classe con variabili membro statiche sia per il ConnectionFactory TIBCO e la Connection stesso, essendo stato detto che loro costruzione è abbastanza risorse e ad alta intensità di tempo:

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

Ora il mio problema è: dove e come potrei

  • raccontare la connessione TIBCO per "chiusura automatica", quando non più necessari (come con il SqlConnection)
  • chiudere la connessione TIBCO su un errore
  • chiudere la connessione TIBCO prima che i nostri finiture app ASP.NET (o l'utente accede al largo)

non mi sembra davvero trovare molte informazioni utili su come utilizzare TIBCO EMS dal mondo C # / .NET ...... eventuali acquirenti ?? Grazie !!

È stato utile?

Soluzione

In primo luogo, non capisco come si potrebbe essere a corto di connessioni. Dal momento che si stanno memorizzando la connessione nell'applicazione, si dovrebbe avere una sola connessione per l'intero IIS applicazione.

che ha messo a parte, vorrei fare quanto segue:

  • Quando la connessione viene recuperato, creare il collegamento come si fa ora;
  • Dopo aver creato il collegamento, spin up un thread in background;
  • Imposta un DateTime per DateTime.Now;
  • Lasciate che il controllo dei precedenti (ad esempio ogni due o ogni 10 secondi) quale sia la differenza tra la data che hai impostato e DateTime.Now. Se questo è più di una specifica timeout, uccidere la connessione e set Application["EMSConnectionFactory"] a null;
  • Quando il thread in background uccide la connessione, chiudere il thread in background;
  • Ogni volta che la connessione viene richiesto, ripristinare il DateTimetoDateTime.Now`.

In questo modo, i collegamenti deve essere chiuso automaticamente.

Si noti che si dovrà presentare bloccaggio. È possibile utilizzare Application.Lock() e Application.Unlock() per questo.

Per quanto riguarda la chiusura su un errore: Vedo che hai attaccato un gestore di eccezioni per l'istanza di connessione. Non potete chiudere la connessione con questo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top