不再需要时自动关闭TIBCO EMS连接

时间:2010-10-26 07:26:03

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

我们将ASP.NET 3.5应用程序中的TIBCO EMS用于外部系统的一个界面,它看起来运行得很好 - 除了运行另一方的人告诉我们我们正在建立连接之类的疯了,永远不会关闭它们....

我正在做的是通过一个具有静态成员变量的类来为TIBCO ConnectionFactoryConnection本身路由所有TIBCO流量,并且已经被告知构建它们是非常资源和时间密集的:

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的有用信息......任何参与者?谢谢!

1 个答案:

答案 0 :(得分:1)

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

放下一边,我会做以下事情:

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

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

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

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