2

我们正在使用 ASP.NET 3.5 应用程序中的 TIBCO EMS 作为外部系统的一个接口,它似乎工作得很好——除了运行另一端的人告诉我们,我们正在疯狂地建立连接,而且从来没有关闭它们......

我正在做的是通过单个类路由所有 TIBCO 流量,该类具有 TIBCOConnectionFactoryConnection自身的静态成员变量,被告知构造它们非常耗费资源和时间:

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 连接
  • 在我们的 ASP.NET 应用程序完成(或用户注销)之前关闭 TIBCO 连接

我似乎并没有从 C# / .NET 世界中找到很多关于如何使用 TIBCO EMS 的有用信息......任何接受者?谢谢!!

4

1 回答 1

1

首先,我不明白你怎么会用完连接。由于您将连接存储在应用程序中,因此整个 IIS 应用程序应该只有一个连接。

撇开这些不谈,我会做以下事情:

  • 检索到连接后,像现在一样创建连接;
  • 创建连接后,启动一个后台线程;
  • 设置DateTimeDateTime.Now;
  • 让后台检查(例如每秒或每 10 秒)您设置的日期和DateTime.Now. 如果这比特定超时时间长,则终止连接并设置Application["EMSConnectionFactory"]为 null;
  • 当后台线程终止连接时,关闭后台线程;
  • 每次请求连接时,重置 DateTime toDateTime.Now`。

这样,连接应该会自动关闭。

请注意,您将不得不引入锁定。您可以为此使用Application.Lock()和。Application.Unlock()

关于关闭错误:我看到您已将异常处理程序附加到连接实例。你不能关闭与它的连接吗?

于 2010-10-26T17:10:10.073 回答