280 likes | 445 Views
Интеграция на приложения. доц. д-р Станимир Стоянов ПУ “ Паисий Хилендарски ” , Катедра “ Компютърни систми ”. Модул “CORBA”. 12. Object Interface. Съдържание. Въведение Символно представяне на референции Управление на референциите на обектите ORB. Въведение.
E N D
Интеграция на приложения доц. д-р Станимир Стоянов ПУ “Паисий Хилендарски”, Катедра “Компютърни систми” Станимир Стоянов
Модул “CORBA” Станимир Стоянов
12. Object Interface Станимир Стоянов
Съдържание • Въведение • Символно представяне на референции • Управление на референциите на обектите ORB Станимир Стоянов
Въведение Станимир Стоянов
Интерфейсът ORB и Object – директно достъпен от клиентите и реализацията на обектитеПричини за това:- Възможност за представяне на обектните референции като символни низове- Трансформацията им във вътрешно представяне- Копиране и изтриване на референции- Сравняване на референции Станимир Стоянов
Интерфейсът Object дефинира някои операции, които се извършват с референциите.Той се наследява от всеки обект, но не се реализира – операциите се извършват от ORB.В езика на CORBA тези операции са реализирани посредством псевдо-обект – не от актуален CORBA обект. Станимир Стоянов
Интерфейсите на псевдо-обектите са дефинирани в OMG IDL, но съществуват някои разлики: • Един псевдо-обект не може да се специфицира като параметър в операция на нормален обект; • Не може да бъде достъпен чрез DII • Няма дефиниции в IR. IDL, който се използва за тези обекти се нарича псевдо-IDL (PIDL). Станимир Стоянов
Символно представяне на референции Станимир Стоянов
Референциите на обектите: • Вътрешни представяния, непрозрачни за външния свят • За да могат да бъдат персистентно съхранявани те трябва да бъдат представени в символен формат • В символен формат могат да бъдат предавани посредством e-mail, Web сайтове, като аргументи на операции. Станимир Стоянов
module CORBA { //PIDLinterface ORB {string object_to_string(in Object obj);Object string_to_object(in string obj); };}; Станимир Стоянов
Управление на референциите на обектите Станимир Стоянов
CORBA::Object - основен интерфейс за всички CORBA обекти: • Операциите могат да се извикат за всяка обектна референция • В повечето случаи функционалността е реализирана в стандартни библиотеки, които се доставят от ORB. Станимир Стоянов
module CORBA { interface Object { //PIDLinterfaceDef get_interface ();boolean is_nil ();Object duplicate ();void release ();boolean is_a (in string logical_type_id);boolean non_existent ();boolean is_equivelent (in Object other_object);unsigned long hash (in unsigned long maximum); Policy get_policy (in Policy Type policy_type); Object set_policy_overrides (in PolicyList policies, in SetOverrideTyp set_add); DomainManagersList get_domain_managers (); void create_request (…) // by the DII};}; Станимир Стоянов
Операция get_interface – връща стандартен интерфейс от IR. Така можем да анализираме дефиницията на интерфейса за съдържащите се операции в run-time.Можем да използваме DII за извикване на тези операции. Станимир Стоянов
Duplicateи release: • Многосъществени за езици с явно управление на паметта (C,C++) – Java е с неявно автоматично управление • Осигуряват коректно управление на копията на обектните референции • Когато една референция трябва да се предаде към друг обект или контролна нишка, вътрешния тип, реализиращ референцията, не трябва да се копира с помощта на средствата на езика за реализация– трябва да се използва операцията duplicate() Станимир Стоянов
Причините за това: • Когато един отдалечен клиент използва една референция – локално се създава един обект-пълномощник (proxy object), който извиква директно съответната операция • Прокси обектът (в съгласие с ORB) създава заявката, която отива при реализацията на обекта • Проксито поддържа брояч за всички референции, които се отнасят за него – нарича се reference count Станимир Стоянов
Ако едно копие на референцията се направи без знанието на проксито, тогава броячът не се увеличава • Когато се освобождават референциите проксито не знае за съществуването на “нелегалната” реферeнция – тогава освобождава използваните ресурси и се изтрива от системата (ако се опитаме да осъществим достъп до нелегалната референция системата връща run-time error) • Ситуацията на Фиг.6.1. Станимир Стоянов
Client Server OR1 := Copy(OR) ProxyObject TargetObject TargetObject 1 2 1 Invalid Object Reference OR1 CORBA::release() Грешно копиране на референции Станимир Стоянов
Когато duplicate() се извиква за получаване на ново копие на референция – проксито ще увеличи брояча и ще чака референциите да извикат release() преди да освободи ресурси и да завърши работата си • Ако последната референция към проксито се изтрие без извикване на release() – проксито продължава да резервира излишни ресурси • Ситуация Фиг.6.2. Станимир Стоянов
Client Server OR ProxyObject TargetObject ProxyObject TargetObject 1 2 1 2 delete(OR) x Грешно изтриване на референции Станимир Стоянов
Коректното използване на duplicate() и release() – Фиг.6.3. • Броячът в проксито отговаря на актуалния брой референции към проксито Станимир Стоянов
Client Server OR1 := OR.duplicate() ProxyObject TargetObject TargetObject ProxyObject 2 2 2 1 OR1 CORBA::release(OR) x Коректно използване на операциите. Станимир Стоянов
Какво става когато референциите се копират (с duplicate()) за предаване през границите на машините – Фиг.6.4, Фиг.6.5 • Не е показано междинното увеличаване на брояча на проксито B преди кода на skeleton да извърши release() когато предава реферанцията обратно към клиента Станимир Стоянов
Server Target Object B 1 Създаване на прокси при предаване на референции Client Proxy Object A OR=PR1.op1() OR 1 Target Object A Op1{ … return OR2.duplicate()); } Proxy Object B OR2 1 1 Client/Server Станимир Стоянов
Server Proxy Object A Proxy Object B Target Object B 1 1 1 Създаване на прокси при предаване на референции OR1 OR Client Target Object A Op1{ … return OR2.duplicate()); } Proxy Object B OR2 1 1 Client/Server Станимир Стоянов
is_nil – проверява една референция дали означава OBJECT_NIL т.е. няма обект • is_a – връща TRUE ако IR идентификаторът, предаден към нея, реферира един тип, който е този обект е подтип • non_existent – проверява дали съществува инстанция на един обект (на референция). Ако не съществува тогава възниква OBJECT_NOT_EXIST изключение. • hash – използва се за търсене на идентични референции, които са по-ефективни от актуалната. • is_equivalent – проверява дали две референции са еквивалентни т.е. сочат към една и съща инстанция. • create_request – операцията се използва за стартиране процеса за създаване на заявки към реализации на обекти при DII. Станимир Стоянов
Последните три операции са свързани с управление на така наречените “политики”, които управляват жизнения цикъл и поведението на обектите. Станимир Стоянов