Auto-chiusura delle connessioni TIBCO EMS quando non servono più
-
26-09-2019 - |
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 !!
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
perDateTime.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 setApplication["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 DateTime
to
DateTime.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?