Перезагрузка TIBCO EMS для С# (TIBCO.EMS.dll)

У нас есть решение TIBCO EMS, которое использует встроенный перехват сервера в серверной среде 2-4. Если TIBCO админирует службы переадресации с одного сервера EMS на другой, предполагается, что соединения должны быть автоматически переведены на новый сервер на уровне обслуживания EMS. Для наших приложений на С#, использующих службу EMS, этого не происходит - наши пользовательские подключения не передаются на новый сервер после отказа, и мы не уверены, почему.

Наше приложение подключается к EMS только при запуске, поэтому, если администратор TIBCO запускает восстановление после того, как пользователи запустили наше приложение, пользователям необходимо перезапустить приложение для повторного подключения к новому серверу (наше соединение EMS использует строку сервера, включая все 4 производственные серверы EMS - если первая попытка не удалась, она переходит к следующему серверу в строке и снова пытается).

Я ищу автоматический подход, который будет периодически пытаться повторно подключаться к EMS, если он обнаружит, что соединение мертво, но я не уверен, как это лучше всего сделать.

Любые идеи? Мы используем TIBCO.EMS.dll версии 4.4.2 и .Net 2.x(приложение SmartClient)

Любая помощь будет оценена.

Ответ 1

Это сообщение должно подвести итоги моих текущих комментариев и более подробно объяснить мой подход...

Типы TIBCO "ConnectionFactory" и "Connection" - это тяжеловесные, потокобезопасные типы. TIBCO предполагает, что вы поддерживаете использование one ConnectionFactory (для каждого настроенного сервера factory) и один для подключения factory.

Сервер также, как представляется, несет ответственность за восстановление и повторное подключение на месте "Connection", поэтому пусть подтвердит, что он выполняет свою работу, а затем опирается на эту функцию.

Создание клиентского решения будет немного более сложным, чем устранение проблемы установки сервера или клиента. Все сеансы, созданные вами из отказавшего соединения, необходимо воссоздать (не говоря уже о производителях, потребителях и пунктах назначения). В обоих типах нет методов "повторного подключения" или "обновления". Сессии не поддерживают ссылку на их родительское соединение.

Вам нужно будет управлять поиском объектов соединения/сеанса и переходить в нуль, повторно инициализируя всех! или реализовать какой-то обработчик события сбоя сеанса, который может получить новое соединение и снова подключить его.

Итак, на данный момент, дайте копнуть и посмотрите, настроен ли клиент для получения уведомления об отказе (руководство пользователя tib ems pg 292). И убедитесь, что поднятое исключение поймано, содержит URL перехода на резервный ресурс и правильно обрабатывается.

Ответ 2

Прежде всего, да, я отвечаю на свой вопрос. Важно отметить, однако, что без аджмастрана я нигде не буду. Большое вам спасибо!

ONE: ConnectionFactory.SetReconnAttemptCount, SetReconnAttemptDelay, SetReconnAttemptTimeout должен быть установлен соответствующим образом. Я думаю, что значения по умолчанию повторяются слишком быстро (порядка 1/2 секунды между попытками). Наши серверы EMS могут занять много времени на восстановление после отказа из-за сетевого хранилища и т.д., Поэтому 5 попыток с интервалом 1/2 с не будут достаточно длинными.

TWO: Я считаю, что это важно для того, чтобы активировать клиент-сервер и сервер-клиент. Не удалось проверить, но без них, клиент может не получить уведомление о том, что сервер находится в автономном режиме или переключается в режим отказа. Это, конечно же, настройка на стороне сервера для EMS.

ТРЕТИЙ: вы можете наблюдать за событием failover, установив 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());
}

Ответ 3

Клиентские приложения могут получать уведомление об отказе путем установки свойства tibco.tibjms.ft.switch.exception system

Возможно, библиотеке нужно работать?