2010-10-26 6 views
2

Мы используем TIBCO EMS из нашего приложения ASP.NET 3.5 для одного интерфейса для внешней системы, и, похоже, он работает очень хорошо - за исключением того, что ребята работают с другим сторона говорит нам, что мы сталкиваемся с такими соединениями, как сумасшедшие, и никогда их не закрываем ....Автоматическое закрытие соединений TIBCO EMS, когда они больше не нужны

Что я делаю - это маршрутизация всего трафика 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 закончится (или пользователь отключится)

0 На самом деле, похоже, что я не нашел много полезной информации о том, как использовать TIBCO EMS из мира C#/.NET ..... любые берущие? Благодаря!!

ответ

1

Во-первых, я не понимаю, как у вас может закончиться соединение. Поскольку вы сохраняете соединение в приложении, у вас должно быть только одно соединение для всего приложения IIS.

что отложить в сторону, я хотел бы сделать следующее:

  • Когда соединение извлекается, создать соединение, как вы делаете сейчас;
  • После того, как вы создали соединение, разверните фоновый поток;
  • 0 a DateTime до DateTime.Now;
  • Позвольте проверить фон (например, каждую секунду или каждые 10 секунд), какая разница между установленной вами датой и DateTime.Now. Если это больше определенного таймаута, убейте соединение и установите Application["EMSConnectionFactory"] в null;
  • Когда фоновый поток убивает соединение, закройте фоновый поток;
  • Каждый раз, когда запрашивается соединение, установите значение DateTime to DateTime.Now`.

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

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

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

+0

Спасибо за ваши мысли - я согласен, у меня было впечатление, что там должно быть единственное соединение - но веб-программирование находится где-то между черным искусством и вуду для меня (я - программист Winforms и backend SQL Server, в основном) –

+0

Здесь может быть проблема параллелизма. Вы должны по крайней мере окружать оператор 'if' в' Application.Lock() 'и' Application.Unlock() '. Это то же самое, что и «lock» в обычном программировании WinForms.Не могли бы вы попытаться выполнить регистрацию времени создания нового соединения? Это может быть намек. –

+0

Спасибо за ваши подсказки - все это на месте (.Lock() и т. Д.), Кажется, значительно улучшилось. –