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

我正在做的是将所有 TIBCO 流量通过单个类路由,该类具有 TIBCO 的静态成员变量 ConnectionFactoryConnection 本身,被告知构建它们是相当资源和时间密集型的:

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 的有用信息......有接受者吗?谢谢!!

有帮助吗?

解决方案

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

抛开这一点,我会做以下事情:

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

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

请注意,您必须引入锁定。您可以使用 Application.Lock()Application.Unlock() 为了这。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top