Fechamento automático de conexões TIBCO EMS quando não são mais necessárias
-
26-09-2019 - |
Pergunta
Estamos usando o TIBCO EMS do nosso aplicativo ASP.NET 3.5 para uma interface com um sistema externo, e parece estar funcionando muito bem - exceto que os caras que executam o outro lado nos dizem que estamos acumulando conexões como loucos e nunca fechando-os....
O que estou fazendo é rotear todo o tráfego TIBCO através de uma única classe com variáveis de membro estáticas para ambos TIBCO ConnectionFactory
e a Connection
em si, tendo sido informado de que construí-los consome muitos recursos e 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;
}
}
Agora meu problema é:onde e como eu poderia
- diga à conexão TIBCO para "fechar automaticamente" quando não for mais necessário (como com o
SqlConnection
) - feche a conexão TIBCO em caso de erro
- feche a conexão TIBCO antes que nosso aplicativo ASP.NET termine (ou o usuário faça logoff)
Eu realmente não pareço encontrar muitas informações úteis sobre como usar o TIBCO EMS do mundo C#/.NET......algum comprador??Obrigado!!
Solução
Em primeiro lugar, não entendo como você pode estar ficando sem conexões.Como você está armazenando a conexão no aplicativo, você deve ter apenas uma conexão para todo o aplicativo IIS.
Deixando isso de lado, eu faria o seguinte:
- Quando a conexão for recuperada, crie-a como você faz agora;
- Depois de criar a conexão, crie um thread em segundo plano;
- Definir um
DateTime
paraDateTime.Now
; - Deixe a verificação de antecedentes (por exemploa cada segundo ou a cada 10 segundos) qual é a diferença entre a data que você definiu e
DateTime.Now
.Se for maior que um tempo limite específico, interrompa a conexão e definaApplication["EMSConnectionFactory"]
para nulo; - Quando o thread de segundo plano encerrar a conexão, feche o thread de segundo plano;
- Cada vez que a conexão for solicitada, redefina o DateTime
to
DataHora.Agora`.
Desta forma, as conexões deverão ser fechadas automaticamente.
Observe que você terá que introduzir o bloqueio.Você pode usar Application.Lock()
e Application.Unlock()
por esta.
Em relação ao fechamento em caso de erro:Vejo que você anexou um manipulador de exceções à instância de conexão.Você não pode fechar a conexão com isso?