【问题标题】:Auto-closing TIBCO EMS connections when no longer needed不再需要时自动关闭 TIBCO EMS 连接
【发布时间】:2010-10-26 07:26:02
【问题描述】:

我们正在使用 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 的有用信息......任何接受者?谢谢!!

【问题讨论】:

    标签: c# tibco tibco-ems auto-close


    【解决方案1】:

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

    暂且不说,我会做以下事情:

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

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

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

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

    【讨论】:

    • 感谢您的想法 - 我同意,我的印象应该是我自己应该有一个单一的连接 - 但网络编程对我来说介于黑色艺术和巫术之间(我是 Winforms 和后端 SQL Server 程序员,主要是)
    • 这里可能存在并发问题。您至少应该将if 语句包围在Application.Lock()Application.Unlock() 中。这与普通 WinForms 编程中的lock 相同。您可以尝试记录创建新连接的时间吗?这可能是一个提示。
    • 感谢您的提示 - 有了所有这些东西(.Lock() 等等),情况似乎有了显着改善。
    最近更新 更多