Spec-Zone .ru
спецификации, руководства, описания, API
|
Темы в этом разделе включают:
COS CORBA (Общие Объектные Службы) Именование Службы обеспечивает, древовидный каталог для ссылок на объект очень как файловая система обеспечивает структуру каталогов для файлов. Услуга Именования, предоставленная с IDL Java, является реализацией
Ассоциацию имени к объекту вызывают привязкой имени. Привязка имени всегда определяется относительно контекста именования. Контекст именования является объектом, который содержит ряд привязки имени, в которой каждое имя уникально. Различные имена могут быть связаны с объектом в тех же самых или различных контекстах одновременно.
Разрешить имя означает определить объект, связанный с именем в данном контексте. Связывать имя означает создать привязку имени в данном контексте. Имя всегда разрешается относительно контекста - нет никаких абсолютных имен.
Поскольку контекст походит на любой другой объект, он может также быть связан с именем в контексте именования. Ограничение контекстов в других контекстах создает график именования - направленный граф с узлами и маркированными краями, где узлы являются контекстами. График именования позволяет более сложным именам ссылаться на объект. Учитывая контекст в графике именования, последовательность имен может сослаться на объект. Эта последовательность имен (названный составным именем) определяет путь в графике именования, чтобы переместиться по процессу разрешения.
Следующие данные показывают пример графика именования. Пример программы, который иллюстрирует, как добавить имена к пространству имен, использует эту ту же самую модель.
Для приложения, чтобы использовать Службу Именования COS, ее ШАР должен знать порт узла, выполняющего службу именования, или иметь доступ к stringified начальному контексту именования для той службы именования. Служба именования может или быть службой именования IDL Java или другой совместимой COS службой именования.
До выполнения клиента или сервера, Вы запустите ORBD. ORBD включает персистентную Службу Именования и переходную Службу Именования, оба из которых являются реализацией Службы Именования COS.
Оба клиента и сервера должны договориться который корневой контекст именования использовать. Метод orb.resolve_initial_references(String name_of_service) используется, чтобы получить корневой контекст именования. Если Вы получите дескриптор на Службе Именования, обеспечивая "NameService" как name_of_service, то Вы получите персистентную службу именования, подразумевая, что график контекста именования будет восстановлен после отказа службы. Если Вы получите дескриптор, используя "TNameService", то Вы получите переходную службу именования, подразумевая, что Вы должны будете повторно получить корневой контекст именования, используя orb.resolve_initial_references(String name_of_service), если будет прерывание службы.
Например,
// get the root naming context org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
Строка "NameService" определяется для всех ШАРОВ CORBA. Когда Вы передаете в этой строке, ШАР возвращает объект контекста именования, который является ссылкой на объект для:
Определить, что Вы хотите использовать переходную службу именования с ORBD, передачей в строке "TNameService". Строка "TNameService" является патентованным названием. Когда Вы передаете в этой строке, ШАР возвращает объект контекста именования, который является ссылкой на объект для переходной службы имен ORBD.
Как со всеми ссылками на объект CORBA, objRef является универсальным объектом CORBA. Чтобы использовать это в качестве объекта NamingContextExt, следует сузить это к его надлежащему типу.
NamingContextExtHelper является idlj - сгенерированный помощник class, подобный в функции к HelloHelper. Объектом ncRef является теперь org.omg.CosNaming.NamingContextExt, и можно использовать его, чтобы получить доступ к службе именования и зарегистрировать сервер.
NamingContextExt и NamingContextExtHelper в новинку для этого выпуска J2SE. NamingContextExt является расширением NamingContext. Это содержит ряд привязки имени, в которой каждое имя уникально и является частью Взаимодействующей Службы Именования. Различные имена могут быть связаны с объектом в тех же самых или различных контекстах одновременно. Используя NamingContextExt, можно использовать основанные на URL имена, чтобы связать и решить. NamingContextExtHelper обеспечивает дополнительные методы помощника как narrow(), которые специфичны для типа, но не имеют дело с бизнес-логикой.
Взаимодействующая Служба Именования (INS) является основанной на URL системой именования сверху CORBA Именование Службы, так же как общего механизма начальной загрузки, который позволяет приложениям совместно использовать общий начальный контекст именования.
Взаимодействующая Служба Именования (INS) обеспечивает следующие функции:
Приложение в качестве примера, которое демонстрирует, как использовать INS, может быть найдено во Взаимодействующем Примере Службы Именования.
Следующая схема показывает, как INS вписывается в ORBD:
Ссылка на объект содержит по крайней мере три сведения: адрес, имя POA, который создал ссылку на объект, и Объектный ID.
Используя INS, можно обеспечить URL, чтобы получить доступ к объекту CORBA, который более читаем чем stringified IOR. Следующие stringified форматы ссылки на объект позволяются:
IOR является ссылкой на объект, которая понимается под ШАРАМИ, которые могут взаимодействовать, используя определенный с помощью OMG GIOP протоколов и IIOP. Клиент может получить ссылку на объект, используя orb.object_to_string(objRef), как показано в Просмотре примера Пространства имен, или в результате вызова на другой ссылке на объект.
Отметьте: Если IOR содержит многократные профили, J2SE v.1.4 и более высокий ШАР всегда использует первый.
Формат corbaloc: полезен для клиентских программ CORBA, и обычно используется, чтобы разрешить ссылку, используя GIOP сообщение Request или LocateRequest. Например, ссылка на объект corbaloc: могла бы быть похожей на это:
corbaloc:iiop:1.2@example.com:2050/TraderService
Это шоу в качестве примера, как получить ссылку на объект для TraderService от узла example.com на порту 2050.
Формат corbaname: предоставляет механизм клиенту, чтобы загрузиться непосредственно, и обычно используется, чтобы разрешить имя stringified от корневого контекста именования. Например, ссылка на объект corbaname: могла бы быть похожей на это:
corbaname::example.com:2050#Personal/schedule
где example.com является узлом, 2050 является портом. Частью ссылки до знака "диез" (corbaname::example.com:2050) является URL, который возвращает корневой контекст именования. Этот пример обеспечивает URL, чтобы использовать для: a) определяют местоположение Службы Именования, и, b) разрешают имя Personal/schedule от Службы Именования.
INS предоставляет возможности ORB для того, чтобы загрузиться. Чтобы загрузить систему CORBA, следует дать этому ссылку на объект. ШАР может быть сконфигурирован, чтобы возвратить дескриптор специализированной службы CORBA от resolve_initial_references(), используя любой ORBInitRef и/или ORBDefaultInitRef. Например,
-ORBInitRef TraderService=corbaloc::example.com:2050/TraderService -ORBDefaultInitRef corbaloc:iiop:1.2:example.com:2050
Порядок разрешения, когда эти опции используются, следующие:
Для получения дополнительной информации о INS, обратитесь к
Чтобы использовать Службу Именования, следует сначала записать сервер и клиентский код, который находит и/или создает пространство имен и/или объекты в пространстве имен. Прежде, чем выполнить клиент и сервер, следует запустить Службу Именования и сказать клиент и сервер, где найти это. Следующие шаги свободно предлагают то, что происходит когда попытка клиента и сервера получить доступ к Службе Именования:
Следующие темы затрагиваются в этом разделе:
Следующий пример программы иллюстрирует, как добавить имена к пространству имен. Это - автономный клиент Службы Именования, который создает следующее простое дерево. Контексты именования курсивом, и ссылки на объект находятся в normal
шрифт.
В этом примере планы являются ссылкой на объект, и Персональный контекст именования, который содержит две ссылки на объект: календарь и расписание.
import java.util.Properties; import org.omg.CORBA.*; import org.omg.CosNaming.*; public class NameClient { public static void main(String args[]) { try {
В разделе, Запуская Службу Именования, сервер имени запускается на порту 1050 и узел localhost. Следующий код гарантирует, что клиентская программа знает об этом номере порта и имени хоста.
Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitialPort", "1050"); props.put("org.omg.CORBA.ORBInitialHost", "localhost"); ORB orb = ORB.init(args, props);
Следующий код получает начальный контекст именования и присваивает его ctx. Вторая строка копирует ctx в фиктивную ссылку на объект objref, что мы присоединим к различным именам и добавим в пространство имен.
NamingContextExt ctx = NamingContextExtHelper.narrow(orb.resolve_initial_references( "NameService")); org.omg.CORBA.Object objref = ctx;
Этот код связывает имя "планы" с нашей фиктивной ссылкой на объект. Ссылка на объект, "планы", тогда добавляется при начальном использовании контекста именования rebind
. rebind
метод позволяет нам выполнять эту программу много раз, не получая исключения, которые мы получили бы от использования bind
.
NameComponent name1[] = ctx.to_name("plans"); ctx.rebind(name1, objref); System.out.println("plans rebind successful!");
Этот код создает новый контекст именования под названием "Персональный". Получающаяся ссылка на объект, ctx2, связывается с именем и добавляется под начальным контекстом именования.
NameComponent name2[] = ctx.to_name("Personal"); NamingContextExt ctx2 = (NamingContextExt)ctx.bind_new_context(name2); System.out.println("New naming context, Personal, added!");
Этот код связывает фиктивную ссылку на объект, используя имена "расписание" и "календарь" под "Персональным" контекстом именования (ctx2).
NameComponent name3[] = ctx.to_name("schedule"); ctx2.rebind(name3, objref); System.out.println("schedule rebind successful!"); NameComponent name4[] = ctx.to_name("calendar"); ctx2.rebind(name4, objref); System.out.println("calendar rebind successful!"); } catch (Exception e) { e.printStackTrace(System.err); } } }
javac NameClient.java
Исправьте любые синтаксические ошибки перед продолжением.
java NameClient -ORBInitialPort 1050
Вывод в окне терминала похож на это:
У нас теперь есть пространство имен, которое к Службе Именования похоже на вышеупомянутую схему.
Следующий пример программы иллюстрирует, как разрешить имена от пространства имен. Разрешить имя означает определить объект, связанный с именем в данном контексте. При использовании персистентной Службы Именования Вы не должны повторно решить, теряет ли работоспособность Служба Именования. Если Вы используете переходную Службу Именования, Вы действительно должны повторно решить в Службе Именования, теряет работоспособность.
В этом примере планы являются ссылкой на объект, и Персональный контекст именования, который содержит две ссылки на объект: календарь и расписание.
import java.util.Properties; import org.omg.CORBA.*; import org.omg.CosNaming.*; public class NameClientResolve { public static void main(String args[]) { try {
В разделе, Запуская Службу Именования, сервер имени запускается на порту 1050 и узел localhost. Следующий код гарантирует, что клиентская программа знает об этом номере порта и имени хоста.
Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitialPort", "1050"); props.put("org.omg.CORBA.ORBInitialHost", "localhost"); ORB orb = ORB.init(args, props);
Следующий код получает начальный контекст именования и присваивает его nc.
NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references( "NameService"));
Следующий код разрешает каждое пространство имен.
org.omg.CORBA.Object sched = nc.resolve_str("Personal/schedule"); org.omg.CORBA.Object cal = nc.resolve_str("Personal/calendar"); org.omg.CORBA.Object plan = nc.resolve_str("plans"); //finish the try-catch block } catch (Exception e) { e.printStackTrace(System.err); } }
javac NameClientResolve.java
Исправьте любые синтаксические ошибки перед продолжением.
java NameClientResolve -ORBInitialPort 1050
Нет никакого вывода к окну терминала, когда Вы выполняете это клиентское приложение. Если Вы хотите проверку, что ссылки на объект были разрешены, Вы могли добавить код такой как следующий для тестирования:
if (sched == null){ System.out.println("Schedule is null"); } if (cal == null){ System.out.println("Calendar is null"); } if (plan == null){ System.out.println("Plans is null"); }
Следующий пример программы иллюстрирует, как просмотреть пространство имен.
import java.util.Properties; import org.omg.CORBA.*; import org.omg.CosNaming.*; public class NameClientList { public static void main(String args[]) { try {
В разделе, Запуская Службу Именования, сервер имен запускается на порту 1050 и узел localhost. Следующий код гарантирует, что клиентская программа знает об этом номере порта и имени хоста.
Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitialPort", "1050"); props.put("org.omg.CORBA.ORBInitialHost", "localhost"); ORB orb = ORB.init(args, props);
NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references( "NameService"));
list
метод перечисляет привязку в контексте именования. В этом случае до 1000 привязки от начального контекста именования будет возвращена в BindingListHolder
; любая остающаяся привязка возвращается в BindingIteratorHolder
.
BindingListHolder bl = new BindingListHolder(); BindingIteratorHolder blIt= new BindingIteratorHolder(); nc.list(1000, bl, blIt);
Этот код вытаскивает массив привязки из возвращенного BindingListHolder.
Binding bindings[] = bl.value;
for (int i=0; i < bindings.length; i++) { int lastIx = bindings[i].binding_name.length-1; // check to see if this is a naming context if (bindings[i].binding_type == BindingType.ncontext) { System.out.println( "Context: " + bindings[i].binding_name[lastIx].id); } else { System.out.println("Object: " + bindings[i].binding_name[lastIx].id); } } } catch (Exception e) { e.printStackTrace(System.err); } } }
javac NameClientList.java
Исправьте любые синтаксические ошибки перед продолжением.
java NameClientList -ORBInitialPort 1050
Вывод в окне терминала похож на это:
orbd
, который включает и Персистентное и Переходную Службу Именования, и доступен с каждой загрузкой J2SE 1.4 и выше. Для вызывающей стороны (клиент, коллега, или клиентское приложение), чтобы быть в состоянии вызвать метод на удаленный объект, та вызывающая сторона должна сначала получить ссылку на удаленный объект.
Как только удаленный объект регистрируется на сервере, вызывающие стороны могут искать объект по имени, получить ссылку удаленного объекта, и затем удаленно вызвать методы на объект.
Чтобы изучить, как запустить Службу Именования, см., что тема Запускает Службу Именования в документации ORBD.
Чтобы остановить службу именования, используйте соответствующую команду операционной системы, такую как kill на Солярисе, или Ctrl+C в окне DOS, в котором работает orbd. Отметьте, что имена, зарегистрированные в службе именования, могут исчезнуть, когда служба завершается, если служба именования является переходным процессом. Служба именования IDL Java будет работать, пока она не будет явно остановлена.
Использовать ШАР Sun со Службой Именования другого поставщика,
-ORBInitRef NameService=corbaloc:iiop:1.2@<H>:<P>/NameService
Когда Вы делаете orb.resolve_initial_references( "NameService" ), следует быть в состоянии соединиться со службой имен 3-ьей стороны. Если Вы все еще не в состоянии соединиться, попробуйте эти подсказки поиска и устранения неисправностей: