我们有一个好EMS解决方案,使用建立在服务器故障在2-4个服务器环境。如果决管理员失败的服务从一个EMS服务器到另一个连接都应该被转移到新的服务器自动EMS服务的水平。我们C#应用程序的使用EMS服务,这是不会发生-我们的用户连接不被转移到新的服务器故障后我们却不知道为什么。

我们的应用程序连接EMS在启动时只有这样,如果决管理员故障后用户已经开始我们的程序,他们的用户需要重新启动的应用程序,以便重新以新服务器(我们EMS连接使用的服务器串包括所有4个生产EMS服务器的-如果第一次尝试失败,它移到下一个服务器的字符串中和再次尝试).

我在寻找一个自动化的方法,这将试图重新连接到EMS周期性的,如果它检测到连接已经死了但我不确定如何最好地这样做。

任何想法?我们使用TIBCO.EMS.dll 版本4.4.2。净2.x(款维护合作伙伴忠诚性的直观工程序)

任何帮助,将不胜感激。

有帮助吗?

解决方案

这个职位应该总结一下我的电流意见和解释我的做法更详细的...

该决'连接工厂"和"连接'类型是重量级的,线安全的类型。好建议保持使用 一个 连接工厂(每台服务器配置的工厂)和 一个 连接每个工厂。

服务器也 出现 负责在地"连接"转移和重新连接,因此,让我们确认这是在做自己的工作,然后依靠。

创建一个客户端的解决方案将会稍微更多的参与比固定服务或客户安装的问题。所有各届会议创建一个连接失败需要重新创造(不提及生产者、消费者和目的地).有没有"连接"或"刷新"的方法上的类型。会议不维持一个参考他们的父母连接。

你必须管理一个查找的连接/会议的目的和疯重新初始化每个人!或实现某种形式的会议失败的事件处理程序可以得到新的连接和重新连接他们。

所以,现在,让我们挖看看如果客户是安装接收转移的通知(tib ems用户指南pg292).和确保提高捕获到异常的,包含故障网址,并被妥善处理。

其他提示

首先,是的,我回答我自己的问题。其重要的是要注意的是,没有ajmastrean,我将一事无成。谢谢你这么多!

一:连接工厂.SetReconnAttemptCount,SetReconnAttemptDelay,SetReconnAttemptTimeout应设置适当。我认为默认的价值观重新尝试的太快了(订单上的1/2的第二之间的重试).我们EMS服务器可能需要很长时间转移,因为网络的储存,等等-所以重试5至1/2的时间间隔是不足够长的时间。

两个:我相信它的重要使客户机-服务器和服务器-客户的心跳。是不是能够验证,但是没有那些在地方、客户可能不会得到通知,服务器下线或交换在故障模式。当然,这是一个服务器方设置。

三:你可以看故障事件,通过设置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());
}

客户应用程序可以接收通知的故障通过设置好.tibjms.ft。开关。例外系统酒店

也许图书馆的需要的工作?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top