Авто-закрытие соединений TIBCO EMS, когда больше не нужно

StackOverflow https://stackoverflow.com/questions/4021520

Вопрос

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top