Автоматическое закрытие соединений TIBCO EMS, когда они больше не нужны - PullRequest
2 голосов
/ 26 октября 2010

Мы используем 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 Ответ

1 голос
/ 26 октября 2010

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

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

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

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

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

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

...