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