- •107 Методические указания «Программное обеспечение сетей эвм. Часть 4. Версия 2. Развитие схемы «клиент-сервер» в com и corba»
- •Введение
- •1.1. Необходимость использования компонент
- •1.2. Методы встраивания компонентов
- •1.3. Основы com
- •1.4. Типы компонентов
- •1.5. Размещение управляющих элементов при помощи cWnd
- •1.6. Использование директивы #import
- •1.7.1 О компонентах
- •1.7. Компоновка тестовой программы
- •1.7.2 Регистрация компонентов
- •1.7.3 Импортирование библиотеки типов
- •1.7.4 Определение членов cDemoClientView
- •1.7.5 Создание компонентов
- •1.7.6 Создание точек взаимодействия
- •1.7.7 Синхронизация параметров
- •1.7.8 Обработка событий от компонентов
- •1.7.9 Очистка
- •1.7.10 Шаблонный код
- •1.9. Индивидуальные задания на работу
- •2.1. Проект. Основные принципы
- •2.2. Как создать компонент
- •Шаг 2: Создание компонента:
- •2.3. Значения по умолчанию
- •2.5. Индивидуальные задания на работу
- •3.1. Cоздание сервера com
- •3.2. Использование com-объектов
- •3.3. Индивидуальные задания на работу
- •Лабораторная работа № 4. Использование atl
- •4.1 Создание dcom-сервера с использованием atl
- •4.1.1 Введение в atl
- •4.1.2 Что такое atl?
- •4.1.3 Разделение труда
- •4.1.4 Создание хранилища компонентов с помощью atl Com AppWizard
- •4.1.5 Вставка кода заглушки/прокси-объекта.
- •4.1.7 Atl com-карта
- •4.1.9 Класс cComModule
- •4.1.10 Язык скриптов реестра в atl
- •4.1.11 Распределенная com (dcom)
- •4.1.12 Dcom и службы nt
- •4.1.13 Структура службы nt
- •4.1.14 Основанный на службах nt сервер сом
- •4.1.15 Создание проекта при помощи atl
- •4.1.16 Добавление функциональных средств
- •4.1.17 Функция CacheQuotes (dcomServiceXdcomService.Cpp)
- •4.1.18 Функция GetQuote (dcomServiceXdcomService.Cpp)
- •4.2 Создание dcom сервера
- •4.3 Создание dcom клиента
- •4.4 Индивидуальные задания на работу
- •Лабораторная работа № 5. Разработка corba приложений
- •5.1. Конфигурирование
- •5.2. Порядок действий
- •5.3. Объектно-ориентированный анализ и моделирование
- •5.4. Описание и трансляция объектов
- •5.5. Создание сервера
- •5.6. Создание клиента
- •5.7. Отладка объектов
- •5.8. Индивидуальные задания на работу
- •Лабораторная работа № 6. Адаптер роа
- •6.1. Архитектура poa
- •6.2. Политики poa
- •Политика обработки запросов
- •6.3. Создание серверов на основе poa
- •6.4. Индивидуальные задания на работу
- •Лабораторная работа № 7. Прикладная задача связи
- •7.1. Постановка задачи
- •7.1.1. Сотовая станция
- •7.1.2. Телефоны
- •7.1.3. Система
- •7.2. Функционирование системы
- •7.3. Индивидуальные задания на работу
- •Лабораторная работа № 8. Работа по умолчанию
- •8.1. Сервер с сервантом по умолчанию
- •8.2. Индивидуальные задания на работу
- •Лабораторная работа № 9. Создание менеджеров сервантов
- •9.1. Менеджеры сервантов
- •ServantActivator
- •ServantLocator
- •9.2. И снова практика
- •9.3. Индивидуальные задания на работу
- •Лабораторная работа № 10. Сервис именования
- •10.1. Сервис для именования (Naming Service)
- •10.2. Индивидуальные задания на работу
9.1. Менеджеры сервантов
Если помните, мы начинали наши занятия с упоминания о менеджерах сервантов, задача которых активировать объекты в тот момент, когда к ним приходит запрос. Полезность данного компонента, появившегося одновременно с адаптером объектов POA, не подлежит сомнению. Как только объектов становится много, поддержание их в активном состоянии значительно увеличивает накладные расходы. Да и не факт, что все эти объекты будут востребованы в процессе работы, а если и будут, то придется проследить за их последующим удалением. Следовательно, отложенная активация и есть тот самый механизм, который позволит избежать ненужной нагрузки на информационные системы.
Спецификация CORBA 2.3 очень четко расписывает работу и составляющие части менеджеров сервантов. Там упоминается пустой интерфейс ServantManager, являющийся прародителем двух других — ServantActivator и ServantLocator. Они-то и используются разработчиками для реализации собственных менеджеров сервантов, причем применение того или иного зависит от политики, установленной для POA. Если программист, создавая POA, планирует хранить ссылки в таблице активных объектов, то он будет использовать политику RETAIN (установлена для нового POA по умолчанию). В этом случае следует создавать свой менеджер сервантов, реализуя в нем интерфейс ServantActivator. При политике NON_RETAIN, которая не дает POA хранить ссылки на активные объекты, нужно реализовать интерфейс ServantLocator. Еще одно важное условие: созданный менеджер сервантов должен быть локальным по отношению к его POA, т. е. располагаться в том же адресном пространстве. И разумеется, предполагается, что установлена политика USE_SERVANT_MANAGER.
ServantActivator
Интерфейс ServantActivator включает в себя всего лишь два метода, служащих функциями обратного вызова, — incarnate() и ethercalize(). Это значит, что они вызываются адаптером объектов в определенных ситуациях.
Метод incarnate() будет вызван, как только поступит запрос для объекта с заданным идентификатором. Если вы хотите создать объект или, скажем, воспользоваться объектом, находящимся в пуле, то следует поместить код, реализующий эти замыслы, именно в метод incarnate(). Для успешного выполнения этой задачи у данного метода есть два важных параметра. Один из них — oid — является идентификатором, отличающим каждый экземпляр объекта. Другим параметром передается ссылка на адаптер объектов POA, в рамках которого должен находиться объект. Метод incarnate() должен возвращать ссылку на тип Servant. Если создание объекта невозможно, возбуждается стандартное исключение CORBA::ForwardRequest:
Servant incarnate (
in ObjectId oid,
in POA adapter)
raises(ForwardRequest);
Помните, что ссылка на созданный объект будет помещена в таблицу активных объектов. Следовательно, при получении очередного запроса к тому же самому объекту POA уже не станет обращаться к менеджеру сервантов, а просто воспользуется готовой ссылкой из таблицы.
Обратный процесс деактивации объекта сопровождается вызовом метода etherealize():
void etherealize(
in ObjectId oid,
in POA adapter,
in Servant serv,
in boolean cleanup_in_progress,
in boolean remaining_activation);
Первые два параметра абсолютно схожи с параметрами метода incarnate(), а третий является ссылкой на сервант деактивируемого объекта. Если этот сервант связан с разными объектами, то параметр remaining_activation будет равен TRUE. Следовательно, уничтожать его нельзя. Предпоследний параметр cleanup_in_progress говорит о причине вызова etherealize(). При значении TRUE вам будет ясно, что причина кроется в вызовах deactivate() или destroy() с параметрами etherialize_objects, равными TRUE.
