Re[3]: Обрыв соединения в DCOM
От: Аноним  
Дата: 10.07.01 12:22
Оценка:
Здравствуйте Grenal, вы писали:

G>Здравствуйте Аноним, вы писали:


А>>Здравствуйте Grenal, вы писали:


G>>>Такая проблема — сервер падает, перегрузили его. Как клиенту словить этот факт и корректно почистить дохлые ссылки на серверные интерфейсы, а так же стоки. Аналогично для сервера, как освободить контекст пользователя, если он внезапно отвалился. Буду благодарен дюбым размышлениям на эту тему, а то я уже вторую неделю думаю, ничего не придумывается :(


А>>Что такое "контекст пользователя"?

А>>DCOM сам отвалит гнилые прокистабы (у DCOM'а есть пинг)
А>>Клиент "словит" факт падения сервера при попытки вызвать метод гнилового прокси.
А>>Если нужно знать это в рантайме — напиши свой метод Ping у какого-нибудь объекта и дергай его каждые n секунд (QueryInterface или AddRef в этой роли не годятся, т.к. DCOM кэширует эти вызовы)

G>Про контекст пользователя. На сервере есть ресурсы, которые пользователь может удаленно захватывать. Ресурсы предоставляет компонент в EXE, который создан как DECLARE_CLASSFACTORY_SINGLETON. Когда пользователь отваливается, он не успевает освободить ресурс и ресурс становится недоступен другим пользователям. Мне приходит в голову только способ при помощи Ping'ов, если типа ping от пользователя не пришел, то его ресурсы можно освобождать. Или может у DCOM есть что-то типа CAsyncSocket::OnClose().


G>Клиент словит падения прокси при вызове методов последнего, это я понимаю, а вот как мне вычистить ссылки на серверные интерфейсы или их можно просто обнулить и как поступить со сток интерфейсами. И клиент и сервер у меня С++ интерфейсы на базе IUnknown.


Про контекст пользователя: Что значит захватывать? Если на все время клиентской сессии, то лучше деражть все ресурсы в несинглтоновском серверном объекте. Тогда это объект умрет, кода умрет его единственная (если не давать его кому-то еще) прокся. Как при корректном ее релизе клиентом, так и, в идеале, при обрыве соединения или некорректной смерти клиента.
Создать такой объект можно и вызовом какого-нибудь метода вашего синглтона

Ненадо ничего специально вычищать — освободи все ссылки, как при нормальном выходе и забутьте о них — заново CoCreateInstance, подписки и т.д.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.