Re: Живучий объект или склеротические клиенты
От: ZORK Россия www.zorkaltsev.com
Дата: 06.09.01 04:30
Оценка:
Здравствуйте Павел, вы писали:

П>Суть проблемы:

П>Аутофпроцессный сервер не умирает, если какой-нибудь из клиентов забыл его релизнуть, или же случайно скончался, никого об этом не уведомив.
П>Похожая проблема уже обсуждалась в форуме см. "Обрыв соединения в DCOM". Там некто "Аноним" заметил, что ссылка автоматически освобождается если клиент безвременно скончается а VladD2 это подтвердил. Должен заметить, что это не совсем так. При некорректной смерти последнего клиента, объект подолжает жить еще несколько минут (что-то около 12), независимо от того синглтоновый он или нет.
П>Если кто исследовал эту проблему, поделитесь пжлста.

Я ставил эксперементы, и вообще не видел что-б он умирал. Единственный способ, который я занаю, после недели ковыряния в этом вопросе — когда клиент подключается к серверу, он отдает серверу интерфейс на себя, чтобы сервер мог дергать какой нить пустой метод этого интерфейса для проверки наличия соединения. Если вызов метода ругается, сервер прекращает соединение. При этом надо быть готовым к ситуации — клиент умер во время вызова этого, или другого метода, тогда вызов надо прерывать по timeout вызовом CoCancelCall.

В целом, используя описанное выше и еще CoDisconnectObject, при удалении сессионых объектов, мне удалось построить соединение между несколькими клиентами одновременно использующих один удаленный сервер. При этом соединение корректно разрывается, если одина из сторон умирает скоропостижной (Например: GPF) смертью, или физическое соединение коротковременно, или долговременно разрывается. Хочу обратить внимание, что при коротковрменном разрыве могут возникать проблемы, если одна сторона заметит разрыв, а вторая нет.

Если все это интересно, я могу попробовать собрать пример, но на это уйдет пару дней
Думать надо ...головой :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.