Повторное подключение отработки отказа TIBCO EMS для C# (TIBCO.ЕВРОПЕЙСКАЯ ВАЛЮТНАЯ СИСТЕМА.файл DLL)
У нас есть решение TIBCO EMS, которое использует встроенную отработку отказа сервера в среде 2-4 сервера. Если администраторы TIBCO выполняют аварийный переход служб с одного сервера EMS на другой, соединения должны автоматически передаваться на новый сервер на уровне службы EMS. Для наших приложений c#, использующих службу EMS, этого не происходит - наши пользовательские подключения не передаются на новый сервер после отработки отказа, и мы не знаем почему.
подключение приложения к ЭМС при запуске только так если Цыбко админы отказа после того, как пользователи начали наше ходатайство, пользователям необходимо перезапустить приложение для того, чтобы подключиться к новому серверу (наш ЕМС подключения используется сервер строке, включая все 4 производства компании EMS сервера - если первая попытка не удается, он переходит к следующему серверу в строке и пытается снова).
Я ищу автоматический подход, который будет пытаться периодически подключаться к EMS, если он обнаружит, что соединение мертво, но я не знаете, как лучше это сделать.
какие идеи? Мы используем TIBCO.ЕВРОПЕЙСКАЯ ВАЛЮТНАЯ СИСТЕМА.dll версии 4.4.2 и .Net 2.x (SmartClient app)
любая помощь будет оценили.
3 ответов
этот пост должен суммировать мои текущие комментарии и объяснить мой подход более подробно...
типы "ConnectionFactory" и "Connection" TIBCO являются тяжеловесными, потокобезопасными типами. TIBCO предлагает вам сохранить использование один ConnectionFactory (на сервер настроен завод) и один подключение на заводе.
сервер появляется нести ответственность за отказоустойчивость "соединения" на месте и повторное подключение, так что давайте подтвердим, что он делает свою работу, а затем опереться на эту функцию.
создание решения на стороне клиента будет немного более сложным, чем исправление проблемы установки сервера или клиента. Все сеансы, созданные из неудачного соединения, необходимо воссоздать (не говоря уже о производителях, потребителях и назначениях). В обоих типах нет методов" повторного подключения "или" обновления". Сеансы не поддерживают ссылку на родительское соединение любой.
вам придется управлять поиском объектов подключения / сеанса и сходить с ума, повторно инициализируя всех! или реализовать какой-то обработчик событий сбоя сеанса, который может получить новое соединение и повторно подключить их.
Итак, сейчас давайте копнем и посмотрим, настроен ли клиент на получение уведомления об отказоустойчивости (tib ems users guide pg 292). И убедитесь, что вызванное исключение поймано, содержит URL-адрес отработки отказа и обрабатывается должным образом.
во-первых, да, я отвечаю на свой собственный вопрос. Важно, однако, отметить, что без аджмастреана я был бы нигде. большое вам спасибо!
один: ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout должны быть установлены соответствующим образом. Я думаю, что значения по умолчанию повторяют попытку слишком быстро (порядка 1/2 секунды между попытками). Наши серверы EMS могут занять много времени для отработки отказа из-за сетевого хранилища и т. д.-Поэтому 5 попыток в 1 / 2s интервалы далеко не достаточно длинные.
два: Я считаю важным включить сердцебиение клиент-сервер и сервер-клиент. Не удалось проверить, но без них клиент может не получить уведомление о том, что сервер отключен или переключается в режим отработки отказа. Это, конечно, настройка на стороне сервера для EMS.
три: вы можете следить за событием отработки отказа, установив Tibems.SetExceptionOnFTSwitch (true); а затем подключение обработчика событий исключений. Когда в среде с одним сервером, вы увидите сообщение" соединение было прервано". Однако, если вы находитесь в отказоустойчивой многосерверной среде, вы увидите следующее: "соединение выполнило отказоустойчивый переключатель на ". Вам не обязательно это уведомление, но оно может быть полезно (особенно при тестировании).
четыре: По-видимому, не ясно в документации EMS, соединение reconnect не будет работать в среде с одним сервером. Вы должны быть в многосерверной, отказоустойчивая среда. Однако есть одна хитрость. Вы можете поместить один и тот же сервер в список соединений дважды - странно, я знаю, но он работает, и он позволяет встроенной логике повторного подключения работать.
код:
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.тибжмс.футовый.переключатель.исключение системного свойства
возможно, библиотеке это нужно для работы?