Re[7]: Обработка ошибок в COM
От: Tom Россия http://www.RSDN.ru
Дата: 16.07.02 10:36
Оценка: 7 (1)
asv>Сервер: один exe-модуль с одним объектом (и одним экземпляром объекта). Объект, реализующий соединение с сервером на стороне клиента (т.е. хранящий указатель на серверный объект и принимающий события от сервера), заключен в dll. Этот объект может использоваться как exe-приложениями (на VC, VB и т.д.), так и ActiveX-ами, которые в свою очередь могут быть вставлены в контейнер типа того же VB. Клиенты обращаются к серверу либо по событию от сервера ("данные изменились, нужно считать"), либо по своей собственной инициативе (если они хотят туда что-то записать). Ну вот и хотелось бы доработать вот этот универсальный клиентский объект, чтобы он мог восстанавливать соединение при перезагрузке сервера.

На ум пришёл явный способ восстановления соединения.
1. На клиенте пишешь COM-SINGLETON с методом OnResumeConnection. (см. дальше)
На сервере добавляешь метод NotifyOnResumeConnection(адрес клиента), который добавляет данного клиента в список для извещения о обрыве связи.
2. Сервер сохраняет:
2.1 Cвоё состояние
2.2 Cписок клиентов
2.3 Состояние клиента (что именно сохранять уже думать тебе, в зависимости от требований по восстановлению)

После запуска сервера он проверяет был ли выход корректным, и если нет, то создаёт обьект на клиентах из списка и вызывает метод OnResumeConnection(...). Самое главное здесь определить промежуточные состояния, (которые будут сохраниться, и для которых возможно корректное восстановление) и реализовать OnResumeConnection. Для не очень сложного проекта или небольшого числа обьектов может и подойдёт.

PS. В OnResumeConnection ты можешь передавать указатель на новый экземпляр сервера.

Tom>>Если очень хочется чего нибудь с этим сделать, то напиши свой DCOM транспорт, который автоматом будет контроллировать всякую бяку, но это от всего гемороя тебя не спасёт.


У нас в одном проекте именно так эта проблемма и решена. (хотя это крайний выход)
Народная мудрось
всем все никому ничего(с).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.