13

我们有一个 TIBCO EMS 解决方案,它在 2-4 个服务器环境中使用内置服务器故障转移。如果 TIBCO 管理员将故障转移服务从一台 EMS 服务器转移到另一台,则连接应该在 EMS 服务级别自动转移到新服务器。对于我们使用 EMS 服务的 C# 应用程序,这不会发生 - 我们的用户连接在故障转移后没有被转移到新服务器,我们不确定原因。

我们的应用程序仅在启动时连接到 EMS,因此如果 TIBCO 管理员在用户启动我们的应用程序后进行故障转移,他们的用户需要重新启动应用程序才能重新连接到新服务器(我们的 EMS 连接使用一个服务器字符串,包括所有 4 个生产 EMS 服务器- 如果第一次尝试失败,它会移动到字符串中的下一个服务器并再次尝试)。

我正在寻找一种自动化方法,如果它检测到连接已失效,它将尝试定期重新连接到 EMS,但我不确定如何最好地做到这一点。

有任何想法吗?我们正在使用 TIBCO.EMS.dll 版本 4.4.2 和 .Net 2.x(SmartClient 应用程序)

任何帮助,将不胜感激。

4

3 回答 3

8

首先,是的,我正在回答我自己的问题。然而,重要的是要注意,如果没有 ajmastrean,我将无处可去。太感谢了!

一:ConnectionFactory.SetReconnAttemptCount、SetReconnAttemptDelay、SetReconnAttemptTimeout 应适当设置。我认为默认值重试太快(重试之间大约 1/2 秒)。由于网络存储等原因,我们的 EMS 服务器可能需要很长时间才能进行故障转移 - 因此以 1/2 秒的间隔重试 5 次远远不够长。

二:我认为启用客户端-服务器和服务器-客户端心跳很重要。无法验证但没有这些,客户端可能不会收到服务器离线或切换到故障转移模式的通知。当然,这是 EMS 的服务器端设置。

三:您可以通过设置 Tibems.SetExceptionOnFTSwitch(true); 来监视故障转移事件;然后连接一个异常事件处理程序。在单服务器环境中,您将看到“连接已终止”消息。但是,如果你在一个容错的多服务器环境中,你会看到这样的:“连接已执行容错切换到”。您并不严格需要此通知,但它可能很有用(尤其是在测试中)。

四:EMS文档中显然没有明确,连接重连在单服务器环境下是行不通的。您需要处于多服务器、容错环境中。然而,有一个窍门。您可以将同一台服务器两次放入连接列表 - 我知道这很奇怪,但它可以工作,并且它使内置的重新连接逻辑能够工作。

一些代码:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}
于 2008-10-24T19:31:10.720 回答
6

这篇文章应该总结我目前的评论并更详细地解释我的方法......

TIBCO 'ConnectionFactory' 和 'Connection' 类型是重量级的线程安全类型。TIBCO 建议您保持使用一个ConnectionFactory(每个服务器配置的工厂)和每个工厂一个Connection。

服务器似乎还负责就地“连接”故障转移和重新连接,所以让我们确认它正在完成它的工作,然后依靠该功能。

创建客户端解决方案将比修复服务器或客户端设置问题稍微复杂一些。您从失败的连接创建的所有会话都需要重新创建(更不用说生产者、消费者和目的地)。两种类型都没有“重新连接”或“刷新”方法。会话也不维护对其父连接的引用。

您将不得不管理连接/会话对象的查找并疯狂地重新初始化每个人!或者实现某种可以获取新连接并重新连接它们的会话失败事件处理程序。

所以,现在,让我们深入了解一下客户端是否设置为接收故障转移通知(tib ems 用户指南第 292 页)。并确保捕获引发的异常,包含故障转移 URL,并且得到正确处理。

于 2008-10-16T21:19:00.443 回答
1

客户端应用程序可以通过设置 tibco.tibjms.ft.switch.exception 系统属性来接收故障转移通知

也许图书馆需要它来工作?

于 2008-10-16T21:04:39.677 回答