Авто-закрытие соединений TIBCO EMS, когда больше не нужно
-
26-09-2019 - |
Вопрос
Мы используем TIBCO EMS из нашего приложения ASP.NET 3.5 для одного интерфейса к внешней системе, и, по-видимому, работает просто отлично - за исключением того, что ребята, работающие на другой стороне, сообщают нам, что мы стеллажны соединения, как сумасшедшие и никогда закрывая их ....
То, что я делаю, расследует все трафик TIBCO через один класс со статическими переменными элементами для как TIBCO ConnectionFactory
и то Connection
Сам, мне сказали, что построение их довольно много ресурсов и времени:
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;
}
}
Теперь моя проблема в том, где и как я мог
- Скажите подключение TIBCO к «Auto-Close», когда больше не нужно (вроде с
SqlConnection
) - Закройте подключение TIBCO по ошибке
- Закройте подключение TIBCO перед нашим приложением ASP.NET (или пользователь выключен)
Мне очень не так, кажется, не нахожу полезную информацию о том, как использовать TIBCO EMS из мира C # / .NET ... Спасибо!!
Решение
Во-первых, я не понимаю, как вы могли бы выйти из соединений. Поскольку вы храните соединение в приложении, вы должны иметь только одно соединение для всего приложения IIS.
Это отложило, я бы сделал следующее:
- Когда соединение извлекается, создайте соединение, как вы делаете сейчас;
- После того, как вы создали соединение, раскрутите фоновую нить;
- Установить A.
DateTime
кDateTime.Now
; - Позвольте обратно проверять (например, каждую секунду или каждые 10 секунд), какая разница между датой, которую вы установили и
DateTime.Now
. Отказ Если это дольше, чем определенный тайм-аут, убить соединение и установитьApplication["EMSConnectionFactory"]
к нулю; - Когда фоновая нить убивает соединение, закройте фоновую нить;
- Каждый раз, когда соединение получает запрос, сброс данных DateTime
to
DateTime.now`
Таким образом, соединения должны быть закрыты автоматически.
Обратите внимание, что вам придется представить блокировку. Вы можете использовать Application.Lock()
а также Application.Unlock()
за это.
Что касается закрытия ошибки: я вижу, что вы прикрепили обработчик исключения к экземпляру соединения. Вы не можете закрыть связь с этим?