繁体   English   中英

TIBCO EMS故障转移重新连接C#(TIBCO.EMS.dll)

[英]TIBCO EMS Failover reconnect for C# (TIBCO.EMS.dll)

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

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

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

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

任何帮助,将不胜感激。

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

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

TWO:我认为启用客户端 - 服务器和服务器 - 客户端心跳非常重要。 无法验证但是如果没有这些,客户端可能无法获得服务器脱机或切换到故障转移模式的通知。 当然,这是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());
}

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

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

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

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

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

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

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

也许图书馆需要这个工作?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM