C#的TIBCO EMS故障切换重新连接(TIBCO.EMS.dll)

C#的TIBCO EMS故障切换重新连接(TIBCO.EMS.dll),c#,tibco,tibco-ems,ems,C#,Tibco,Tibco Ems,Ems,我们有一个TIBCO EMS解决方案,在2-4服务器环境中使用内置服务器故障切换。如果TIBCO管理员将服务从一台EMS服务器故障转移到另一台EMS服务器,则应在EMS服务级别将连接自动转移到新服务器。对于我们使用EMS服务的C#应用程序,这种情况不会发生——我们的用户连接在故障转移后不会转移到新服务器,我们不确定原因 我们的应用程序仅在启动时连接到EMS,因此,如果TIBCO管理员在用户启动我们的应用程序后进行故障切换,则用户需要重新启动应用程序才能重新连接到新服务器(我们的EMS连接使用一个

我们有一个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(智能客户端应用程序)


任何帮助都将不胜感激。

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

也许图书馆需要这样做?

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

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

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

创建客户端解决方案要比修复服务器或客户端安装问题稍微复杂一些。需要重新创建通过失败连接创建的所有会话(更不用说生产者、使用者和目标)。没有“重新连接”或“刷新”方法。会话也不维护对其父连接的引用

您必须管理连接/会话对象的查找,并重新初始化everyone!或实现某种会话失败事件处理程序,以获取新连接并重新连接它们


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

首先,是的,我在回答我自己的问题。但需要注意的是,如果没有ajmastrean,我将一事无成。非常感谢

一: ConnectionFactory.SetReconAttentimptCount、SetReconAttentimptDelay、SetReconAttentimptTimeout应适当设置。我认为默认值重试过快(重试间隔约为1/2秒).由于网络存储等原因,我们的EMS服务器可能需要很长时间进行故障切换-因此,每隔1/2秒重试5次远远不够长

二: 我认为启用客户端-服务器和服务器-客户端心跳非常重要。无法验证,但如果没有这些,客户端可能无法收到服务器脱机或切换到故障切换模式的通知。当然,这是EMS的服务器端设置

三: 您可以通过设置Tibems.setExceptionOnNFTSwitch(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());
}
private void initEMS()
{
Tibems.setExceptionOnNFTSwitch(真);
_ConnectionFactory=new TIBCO.EMS.TopicConnectionFactory();
_ConnectionFactory.SetReconAttemptCount(30);//30次重试
_ConnectionFactory.SetReconAttemptDelay(120000);//2分钟
_ConnectionFactory.SetReconAttentimpTimeout(2000);//2秒
_Connection=_ConnectionFactory.CreateTopicConnectionM(,);
_Connection.ExceptionHandler+=新的EMSExceptionHandler(\u Connection\u ExceptionHandler);
}
private void\u Connection\u ExceptionHandler(对象发送方,EMSExceptionEventArgs)
{
EMSException e=args.Exception;
//args.Exception=“连接已终止”--单服务器故障
//args.Exception=“连接已执行容错切换到”--容错多服务器
Show(例如ToString());
}

您目前是如何实现容错的?在“factories.conf”文件中的服务器上?您的“url”属性是否包含第134页“tib_ems_dotnet_ref.pdf”中指定的url的逗号分隔列表?是的,信不信由你,这就是问题所在。当ems服务器版本已故障转移。当您的连接字符串中有一个分隔的EMS服务器列表时,这应该可以工作,但我相信EMS.lib中有一个错误使其无法工作。这是侦听器在故障转移后引发的错误吗?是生产者在故障转移后引发的错误(发送消息时)?最可能的情况是,库希望您重新连接。在连接字符串中提供多个服务器只是让它可以重新连接