Автоматическое закрытие соединений 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"] обнулить;
  • Когда фоновый поток уничтожает соединение, закройте фоновый поток;
  • Каждый раз, когда запрашивается соединение, сбрасывайте DateTimetoDateTime.Now`.

Таким образом, соединения должны быть закрыты автоматически.

Обратите внимание, что вам придется ввести блокировку. Ты можешь использовать Application.Lock() а также Application.Unlock() за это.

Что касается закрытия ошибки: я вижу, что вы подключили обработчик исключений к экземпляру соединения. Вы не можете закрыть связь с этим?

Другие вопросы по тегам