Распределенные системы (Менеджер сервантов) Менеджер сервантов Менеджер сервантов – объект, позволяющий производить активацию объекта в момент прихода запроса к данному объекту. От интерфейса 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 запросы, канал события не нуждается в доставке события потребителю в то же время когда это событие сгенерировал поставщик.