lect5

advertisement
Распределенные
системы
(Менеджер сервантов)
Менеджер сервантов
Менеджер сервантов – объект, позволяющий производить
активацию объекта в момент прихода запроса к данному
объекту.
От интерфейса ServantManager наследуются интерфейсы
ServantActivator и ServantLocator
Требования необходимые для
использования менеджера сервантов
1. Установлена политика USE_SERVANT_MANAGER
2. В случае использования политики RETAIN, менеджер
сервантов реализует интерфейс ServantActivator
3. В случае использования политики NON_RETAIN
менеджер сервантов реализует интерфейс ServantLocator
4. Менеджер сервантов должен быть локальным по
отношению к POA, т.е. выполняться в том же адресном
пространстве
Интерфейс ServantActivator (часть1)
Servant incarnate ( in ObjectId oid, in POA adapter)
raises(ForwardRequest);
Вызывается при поступлении запроса к объекту с
заданным идентификатором, может содержать код по
созданию объекта или поиска объекта в пуле. В случае
невозможности создания объекта возбуждается
исключительная ситуация.
Интерфейс ServantActivator (часть2)
void etherealize(
in ObjectId oid,
in POA adapter,
in Servant serv,
in boolean cleanup_in_progress,
in boolean remaining_activation);
Отвечает за деактивацию объекта. В случае, если сервант
связан с несколькими идентификаторами, то параметр
remaining_activation будет установлен в true
Интерфейс ServantLocator
Данный интерфейс используется для работы с объектами
без хранения состояния (stateless). Поскольку используется
политика NON_RETAIN, то обращение к менеджеру
производится при каждом запросе к объекту.
Интерфейс ServantLocator (часть1)
Servant preinvoke(
in ObjectId oid,
in POA
adapter,
in CORBA::Identifier operation,
out Cookie
the_cookie)
raises(ForwardRequest);
operation - название операции объекта, которая будет
вызвана адаптером объектов после возврата из метода
preinvoke()
the_cookie – контейнер данніх, поозволяющий хранить
данніе до візова метода postinvoke()
Интерфейс ServantLocator (часть2)
void postinvoke(
in ObjectId oid,
in POA adapter,
in CORBA::Identifier operation,
in Cookie the_cookie
in Servant the_servant);
Задание менеджера сервантов
ServantActivator activator =
new SimplelActivator()._this(orb);
dcpPOA.set_servant_manager(activator);
Распределенные
системы
(DII & SII)
DII – Dynamic Invocation Interface
Интерфейс динамических вызовов позволяет
приложениям клиентов формировать произвольные
запросы к объектам-серверам, интерфейсы которых
неизвестны на стадии компиляции клиентского
приложения.
Информация о структуре интерфейса, к которому
обращается клиент для вызова соответствующей
операции, может быть получена во время работы
программы, если известны имя операции и список
параметров и имеется ссылка на соответствующий
объект-сервер.
Особенности применения статических
заглушек
• IDL-сгенерированные заглушки управляют вызовом
методов. В заглушке созданы методы для каждого метода
интерфейса
• Большая эффективность
• Может быть получен доступ только к объектам
определенного типа
• Каждое клиентское приложение реализовывается только
для фиксированного набора интерфейсов
• Интерфейсы должны быть известны на этапе компиляции
Особенности динамического вызова
• Не используются сгенерированные заглушки
• Клиентский код может содержать создание собственных
запросов
• Приводит к изменению только клиентской части,
серверная часть остается неизменной
• Меньшая эффективность
• Возможность функционирования при отсутствии описания
методов на этапе компиляции
• Возможно применения совместно с репозиторием
интерфейсов (IFR – Interface Repository)
Порядок действий при использовании
интерфейса динамических вызовов (DII)
•
•
•
•
•
•
Получить объектную ссылку
Создать объект Request
Определить целевой объект и действие
Задать параметры
Выполнить запрос
Обработать результат если необходимо
Пример использования DII (интерфейс)
interface server
{
attribute long long_number;
exception e {
string why;
};
string writeNumber( in long i ) raises (e);
void add(in long i, in long j, out long r );
string writeNumberWithEx( in long i ) raises (e);
oneway void notify( in string msg );
};
Пример использования DII (клиент)
(простой вызов)
org.omg.CORBA.Object s = nc.resolve( nc.to_name("dii.example"));
org.omg.CORBA.Request r = s._request("_get_long_number");
r.set_return_type(
orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_long));
r.invoke();
if( r.env().exception() != null )
{
throw r.env().exception();
}
else
{
System.out.println("0: " + r.return_value() );
}
…
Пример использования DII (клиент)
(вызов с out параметрами)
org.omg.CORBA.Object s =
nc.resolve( nc.to_name("dii.example"));
org.omg.CORBA.Request r_out = s._request("add");
r_out.add_in_arg().insert_long( 3 );
r_out.add_in_arg().insert_long( 4 );
org.omg.CORBA.Any out_arg = r_out.add_out_arg();
out_arg.type( orb.get_primitive_tc(
org.omg.CORBA.TCKind.tk_long) );
r_out.set_return_type( orb.get_primitive_tc(
org.omg.CORBA.TCKind.tk_void));
r_out.invoke();
System.out.println(out_arg.extract_long() );
…
Пример использования DII (клиент)
(простой вызов, строковый параметр,
oneway)
…
org.omg.CORBA.Object s =
nc.resolve( nc.to_name("dii.example"));
org.omg.CORBA.Request r1 = s._request("notify");
r1.add_in_arg().insert_string("hallo");
r1.send_oneway();
…
Распределенные
системы
(сервис событий)
Сервис событий (event service)
Сервис общего назначения (COS), реализующая
событийную связь между поставщиками и потребителями
событий
Модель выталкивания (Push Model)
В модели выталкивания, поставщики "выталкивают"
событие потребителям; поставщики передают событие,
вызывая операцию push интерфейса PushConsumer.
Для установления соединения по типу выталкивания,
потребители и поставщики обмениваются объектными
ссылками PushConsumer и PushSupplier. Событийная связь
может быть разорвана вызовом операции
disconnect_push_consumer интерфейса PushConsumer или
операции disconnect_push_supplier интерфейса PushSupplier.
Модель вытягивания (Pull Model)
В модели вытягивания, потребители "вытягивают" события
из поставщиков; то есть потребители запрашивают событие,
вызывая операцию pull интерфейса PullSupplier.
Для установления связи по типу вытягивания, потребители
и поставщики должны обменяться объектными ссылками на
PullConsumer и PullSupplier. Событийная связь может быть
разорвана вызовом операции disconnect_pull_consumer
интерфейса PullConsumer или вызовом операции
disconnect_pull_supplier интерфейса PullSupplier.
Каналы событий
Канал события - это сервис развязывающий связь между
поставщиками и потребителями. Канал события сам
является поставщиком и потребителем события.
Канал события предоставляет асинхронную событийную
связь между поставщиками и потребителями. Хотя
потребители и поставщики соединяясь с каналом события
используют стандартные CORBA запросы, канал события не
нуждается в доставке события потребителю в то же время
когда это событие сгенерировал поставщик.
Download