Распределенные системы (Naming Service) Ссылки на объекты в CORBA IOR (Interoperable Object Reference) – ссылка на CORBA объект, содержащая информацию, необходимую для обеспечения возможности подключения клиентского ORB к объекту или серванту. Для взаимодействия может использоваться протокол IIOP. IIOP, GIOP IIOP (Internet Inter-ORB Protocol) – интернет протокол взаимодействия между ORB. Является одой из реализаций протокола GIOP. GIOP (General Inter-ORB Protocol) – обобщенный протокол обмена между ORB. Является стандартизованным протоколом обмена между различными ORB. Поддерживает 8 типов сообщений Пример IOR IOR:000000000000002B49444C3A6F6D672E6F72672F43 6F734E616D696E672F4E616D696E67436F6E746578744 578743A312E30000000000002000000000000007400010 2000000000E3139322E3136382E372E313234000E6D000 0001F5374616E646172644E532F4E616D6553657276657 22D504F412F5F726F6F740000000002000000000000000 8000000004A414300000000010000001C0000000000010 00100000001050100010001010900000001050100010000 00010000002C0000000000000001000000010000001C00 00000000010001000000010501000100010109000000010 5010001 Организация IOR со специфической для IIOP иформацией Теговый профиль (tagged profile) Содержит всю информацию, необходимую для доступа к объекту. Если сервером поддерживается несколько протоколов, то информация о каждом из них содержится в теговом профиле. Пример использования IOR (Server) package ior; import org.omg.CORBA.ORB; import java.io.*; public class IorServer { public static void main(String args[]) throws IOException { //create object and register with ORB SimpleObjectImpl simple = new SimpleObjectImpl(); //initialize ORB and stringify object ORB orb = ORB.init(args, null); String ior = orb.object_to_string(simple); System.out.println("IOR: " + ior); //write stringified object to file FileWriter fw = new FileWriter("simple.ior"); fw.write(ior); fw.close(); } } //Some other code … … Пример использования IOR (Client) package ior; import org.omg.CORBA.ORB; import java.io.*; public class IorClient { public static void main(String args[]) throws IOException { //initialize ORB and stringify object ORB orb = ORB.init(args, null); //read stringified object to file FileReader fr = new FileReader("simple.ior"); BufferedReader br = new BufferedReader(fr); String ior = br.readLine(); org.omg.CORBA.Object obj = orb.string_to_object(ior); //downcast obj to SimpleObject, then invoke methods SimpleObject proxy = SimpleObjectHelper.narrow(obj); } } //invoke methods proxy.invoke(); System.out.println("Invoked method on simple object"); Некоторые варианты обеспечения доступа к IOR Распределенные ФС – сервер записывает преобразованну в строку IOR в известную общую папку, для обеспечения доступа клиентским приложениям Web публикация – сервер записывает IOR в соответствии с определенным локатором ресурса Использование БД для хранения симвлических имен и сылок на объекты. Сервис именований (naming service) Сервис именований (naming service) – базовый сервис CORBA, содержащий набор пар (имя, IOR) для объектов, к которым может подключиться клиент. Клиент предоставляет имя объекта и служба находит и возвращает IOR этого объекта. Naming Service хранит ссылки на объекты в иерархическом пространстве имен. Иерархичность пространства имен можно сравнить с файловой системой. Пример иерархического именования building-461-fax 1 Работа с сервисом именований Получение начального контекста именований (initial naming context) … //initialize ORB ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef; objRef = orb.resolve_initial_references(“NameService”); NamingContext ncRef; ncRef = NamingContextHelper.narrow(objRef); ... Работа с сервисом именований Получение ссылки на объект NamingContext предоставляет методы для создание вложенных контекстов, регистрации CORBA объектов и поиска CORBA объектов. bind() – связывает объект с контекстом именования; rebind() – уничтожает связь имени с объектом и связывает это имя с другим объектом; resolve() – возвращает ссылку на объект, связанный с указанным именем new_context() – создает новый, не связанный контекст именования. bind_context() – привязывает новый контекст к сервису именования (аналог создания подкаталога в файловой системе) } Работа с сервисом именований Получение ссылки на объект (пример) NamingContext ncRef = //get initial context here //create the naming path, a compound name NameComponent name[] = { new NameComponent("simple", ""), new NameComponent("object", "") }; //resolve the path to a reference org.omg.CORBA.Object ref; SimpleObject obj; ref = ncRef.resolve(name); obj = SimpleObjectHelper.narrow(ref); Работа с сервисом именований привязка (пример) NameComponent simpleName[] = { new NameComponent("simple", "") }; simpleCxt = ncRef.new_context(); try { ncRef.bind_context(simpleName, simpleCxt); } catch(AlreadyBound ex) { //already bound so resolve to it instead objRef = ncRef.resolve(simpleName); simpleCxt = NamingContextHelper.narrow(objRef); } //export the object to the naming service NameComponent objName[] = { new NameComponent("object", "") }; simpleCxt.rebind(objName, obj); //block to prevent program from ending and wait for client requests System.out.println("Ready for client simple requests...");