我们有一个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应用程序)
任何帮助都将不胜感激。
答案 0 :(得分:8)
首先,是的,我正在回答我自己的问题。然而,重要的是要注意,如果没有ajmastrean,我将无处可去。非常感谢你!
ONE: 应正确设置ConnectionFactory.SetReconnAttemptCount,SetReconnAttemptDelay,SetReconnAttemptTimeout。我认为默认值重复得太快(重试之间的1/2秒)。由于网络存储等原因,我们的EMS服务器可能需要很长时间才能进行故障转移 - 所以每隔1/2个间隔进行5次重试远远不够。
TWO: 我认为启用客户端 - 服务器和服务器 - 客户端心跳非常重要。无法验证但是如果没有这些,客户端可能无法获得服务器脱机或切换到故障转移模式的通知。当然,这是EMS的服务器端设置。
三: 您可以通过设置Tibems.SetExceptionOnFTSwitch(true)来监视故障转移事件;然后连接异常事件处理程序。在单服务器环境中,您将看到“已终止连接”消息。但是,如果您处于容错多服务器环境中,您将看到:“连接已执行容错切换到”。您并不严格需要此通知,但它可能很有用(特别是在测试中)。
FOUR: 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());
}
答案 1 :(得分:6)
这篇文章应该总结我当前的评论并更详细地解释我的方法......
TIBCO'ConnectionFactory'和'Connection'类型是重量级,线程安全的类型。 TIBCO建议您保持使用一个 ConnectionFactory(每个服务器配置的工厂)和一个每个工厂的连接。
服务器也出现负责就地“连接”故障转移和重新连接,所以让我们确认它正在完成其工作,然后依靠该功能。
创建客户端解决方案比修复服务器或客户端设置问题稍微复杂一些。您需要重新创建从失败的连接创建的所有会话(更不用说生产者,消费者和目的地)。两种类型都没有“重新连接”或“刷新”方法。会话也不保持对其父连接的引用。
您必须管理连接/会话对象的查找,并坚持重新初始化每个人!或实现某种会话失败事件处理程序,它可以获取新连接并重新连接它们。
所以,现在,让我们深入了解客户端是否设置为接收故障转移通知(tib ems用户指南第292页)。并确保捕获引发的异常,包含故障转移URL,并且正在正确处理。
答案 2 :(得分:1)
客户端应用程序可以通过设置tibco.tibjms.ft.switch.exception系统属性来接收故障转移通知
也许图书馆需要这样才能工作?