不再需要时自动关闭 TIBCO EMS 连接
-
26-09-2019 - |
题
我们正在使用 ASP.NET 3.5 应用程序中的 TIBCO EMS 作为与外部系统的一个接口,它似乎工作得很好 - 除了运行另一端的人告诉我们,我们正在疯狂地建立连接,而且从来没有关闭它们....
我正在做的是将所有 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 连接
- 在 ASP.NET 应用程序完成(或用户注销)之前关闭 TIBCO 连接
我似乎并没有真正从 C# / .NET 世界中找到太多关于如何使用 TIBCO EMS 的有用信息......有接受者吗?谢谢!!
解决方案
首先,我不明白你怎么会耗尽连接。由于您将连接存储在应用程序中,因此整个 IIS 应用程序应该只有一个连接。
抛开这一点,我会做以下事情:
- 当检索到连接时,像现在一样创建连接;
- 创建连接后,启动后台线程;
- 设置一个
DateTime
到DateTime.Now
; - 让背景调查(例如每秒或每 10 秒)您设置的日期与
DateTime.Now
. 。如果超过特定超时,则终止连接并设置Application["EMSConnectionFactory"]
为空; - 当后台线程杀死连接时,关闭后台线程;
- 每次请求连接时,重置日期时间
to
日期时间.Now`。
这样,连接应该自动关闭。
请注意,您必须引入锁定。您可以使用 Application.Lock()
和 Application.Unlock()
为了这。
关于错误关闭:我看到您已将异常处理程序附加到连接实例。你不能关闭它的连接吗?
不隶属于 StackOverflow