Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Именование Службы

Темы в этом разделе включают:

Служба Именования COS: Краткий обзор

COS CORBA (Общие Объектные Службы) Именование Службы обеспечивает, древовидный каталог для ссылок на объект очень как файловая система обеспечивает структуру каталогов для файлов. Услуга Именования, предоставленная с IDL Java, является реализацией спецификации Службы Именования COS. Следующий краткий обзор берется из того документа.

Ассоциацию имени к объекту вызывают привязкой имени. Привязка имени всегда определяется относительно контекста именования. Контекст именования является объектом, который содержит ряд привязки имени, в которой каждое имя уникально. Различные имена могут быть связаны с объектом в тех же самых или различных контекстах одновременно.

Разрешить имя означает определить объект, связанный с именем в данном контексте. Связывать имя означает создать привязку имени в данном контексте. Имя всегда разрешается относительно контекста - нет никаких абсолютных имен.

Поскольку контекст походит на любой другой объект, он может также быть связан с именем в контексте именования. Ограничение контекстов в других контекстах создает график именования - направленный граф с узлами и маркированными краями, где узлы являются контекстами. График именования позволяет более сложным именам ссылаться на объект. Учитывая контекст в графике именования, последовательность имен может сослаться на объект. Эта последовательность имен (названный составным именем) определяет путь в графике именования, чтобы переместиться по процессу разрешения.

Следующие данные показывают пример графика именования. Пример программы, который иллюстрирует, как добавить имена к пространству имен, использует эту ту же самую модель.

Пример именования графика

Для приложения, чтобы использовать Службу Именования 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 - сгенерированный класс помощника, подобный в функции к HelloHelper. Объектом ncRef является теперь org.omg.CosNaming.NamingContextExt, и можно использовать его, чтобы получить доступ к службе именования и зарегистрировать сервер.

NamingContextExt и NamingContextExtHelper в новинку для этого выпуска J2SE. NamingContextExt является расширением NamingContext. Это содержит ряд привязки имени, в которой каждое имя уникально и является частью Взаимодействующей Службы Именования. Различные имена могут быть связаны с объектом в тех же самых или различных контекстах одновременно. Используя NamingContextExt, можно использовать основанные на URL имена, чтобы связать и решить. NamingContextExtHelper обеспечивает дополнительные методы помощника как narrow(), которые специфичны для типа, но не имеют дело с бизнес-логикой.

Взаимодействующая Служба Именования

Взаимодействующая Служба Именования (INS) является основанной на URL системой именования сверху CORBA Именование Службы, так же как общего механизма начальной загрузки, который позволяет приложениям совместно использовать общий начальный контекст именования.

Взаимодействующая Служба Именования (INS) обеспечивает следующие функции:

Приложение в качестве примера, которое демонстрирует, как использовать INS, может быть найдено во Взаимодействующем Примере Службы Именования.

Следующая схема показывает, как INS вписывается в ORBD:

ORBD



Ссылка на объект содержит по крайней мере три сведения: адрес, имя POA, который создал ссылку на объект, и Объектный ID.

Используя INS, можно обеспечить URL, чтобы получить доступ к объекту CORBA, который более читаем чем stringified IOR. Следующие stringified форматы ссылки на объект позволяются:

Опции начальной загрузки для ШАРА

INS предоставляет возможности ORB для того, чтобы загрузиться. Чтобы загрузить систему CORBA, следует дать этому ссылку на объект. ШАР может быть сконфигурирован, чтобы возвратить дескриптор специализированной службы CORBA от resolve_initial_references(), используя любой ORBInitRef и/или ORBDefaultInitRef. Например,

-ORBInitRef TraderService=corbaloc::example.com:2050/TraderService
-ORBDefaultInitRef corbaloc:iiop:1.2:example.com:2050

Порядок разрешения, когда эти опции используются, следующие:

  1. Объекты зарегистрировались в register_initial_references
  2. -ORBInitRef
  3. -ORBDefaultInitRef
  4. Собственная Начальная загрузка (ШАРЫ Sun только)

Для получения дополнительной информации о INS, обратитесь к Спецификации Именования INS.

Используя Службу Именования

Чтобы использовать Службу Именования, следует сначала записать сервер и клиентский код, который находит и/или создает пространство имен и/или объекты в пространстве имен. Прежде, чем выполнить клиент и сервер, следует запустить Службу Именования и сказать клиент и сервер, где найти это. Следующие шаги свободно предлагают то, что происходит когда попытка клиента и сервера получить доступ к Службе Именования:

Следующие темы затрагиваются в этом разделе:

Демонстрационный Клиент: Добавление Объектов к Пространству имен

Следующий пример программы иллюстрирует, как добавить имена к пространству имен. Это - автономный клиент Службы Именования, который создает следующее простое дерево. Контексты именования курсивом, и ссылки на объект находятся в normal шрифт.

добавление имен к пространству имен

В этом примере планы являются ссылкой на объект, и Персональный контекст именования, который содержит две ссылки на объект: календарь и расписание.

  1. Создайте файл NameClient.java и импортируйте надлежащие библиотеки:
    import java.util.Properties;
    import org.omg.CORBA.*;
    import org.omg.CosNaming.*;
    
    public class NameClient
    {
       public static void main(String args[])
       {
          try {
    
  2. Свойства Port и Host набора.

    В разделе, Запуская Службу Именования, сервер имени запускается на порту 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);
    
  3. Получите начальный контекст именования.

    Следующий код получает начальный контекст именования и присваивает его ctx. Вторая строка копирует ctx в фиктивную ссылку на объект objref, что мы присоединим к различным именам и добавим в пространство имен.

     
            NamingContextExt ctx =
              NamingContextExtHelper.narrow(orb.resolve_initial_references(
                "NameService"));
            org.omg.CORBA.Object objref = ctx;
    
  4. Свяжите имя "планы" со ссылкой на объект.

    Этот код связывает имя "планы" с нашей фиктивной ссылкой на объект. Ссылка на объект, "планы", тогда добавляется при начальном использовании контекста именования rebind. rebind метод позволяет нам выполнять эту программу много раз, не получая исключения, которые мы получили бы от использования bind.

            NameComponent name1[] = ctx.to_name("plans");
            ctx.rebind(name1, objref);
            System.out.println("plans rebind successful!");
    
  5. Создайте новый контекст именования под названием "Персональный".

    Этот код создает новый контекст именования под названием "Персональный". Получающаяся ссылка на объект, ctx2, связывается с именем и добавляется под начальным контекстом именования.

            NameComponent name2[] = ctx.to_name("Personal");
            NamingContextExt ctx2 = (NamingContextExt)ctx.bind_new_context(name2);
            System.out.println("New naming context, Personal, added!");
    
  6. Свяжите "расписание" и "календарь" к фиктивной ссылке на объект. Связывать имя означает создать привязку имени в данном контексте. Имя всегда разрешается относительно контекста - нет никаких абсолютных имен.

    Этот код связывает фиктивную ссылку на объект, используя имена "расписание" и "календарь" под "Персональным" контекстом именования (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);
        }
      }  
    }
    
  7. Сохраните NameClient.java, и скомпилируйте файл следующим образом:
         javac NameClient.java
    

    Исправьте любые синтаксические ошибки перед продолжением.

  8. Выполните Демона Посредника запросов к объектам как показано в Запуске Службы Именования.
  9. Выполните NameClient, следующим образом:
         java NameClient -ORBInitialPort 1050
    

Вывод в окне терминала похож на это:

вывод в окне терминала

У нас теперь есть пространство имен, которое к Службе Именования похоже на вышеупомянутую схему.

Демонстрационный Клиент: Разрешение Объектов от Пространства имен

Следующий пример программы иллюстрирует, как разрешить имена от пространства имен. Разрешить имя означает определить объект, связанный с именем в данном контексте. При использовании персистентной Службы Именования Вы не должны повторно решить, теряет ли работоспособность Служба Именования. Если Вы используете переходную Службу Именования, Вы действительно должны повторно решить в Службе Именования, теряет работоспособность.

В этом примере планы являются ссылкой на объект, и Персональный контекст именования, который содержит две ссылки на объект: календарь и расписание.

  1. Создайте файл NameClientResolve.java и импортируйте надлежащие библиотеки:
    import java.util.Properties;
    import org.omg.CORBA.*;
    import org.omg.CosNaming.*;
    
    public class NameClientResolve
    {
       public static void main(String args[])
       {
          try {
    
  2. Свойства Port и Host набора.

    В разделе, Запуская Службу Именования, сервер имени запускается на порту 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);
    
    
  3. Получите начальный контекст именования.

    Следующий код получает начальный контекст именования и присваивает его nc.

     
            NamingContextExt nc =
              NamingContextExtHelper.narrow(orb.resolve_initial_references(
                "NameService"));
    
  4. Разрешите каждое пространство имен.

    Следующий код разрешает каждое пространство имен.

       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);
            } 
    }
    
  5. Сохраните NameClientResolve.java, и скомпилируйте файл следующим образом:
         javac NameClientResolve.java
    

    Исправьте любые синтаксические ошибки перед продолжением.

  6. Удостоверьтесь, что Демон Посредника запросов к объектам работает и клиентское приложение, иллюстрированное в Демонстрационном Клиенте: Добавление Объектов к Пространству имен было выполнено.
  7. Выполните NameClientResolve, следующим образом:
         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");
        }

Демонстрационный Клиент: Просмотр Пространства имен

Следующий пример программы иллюстрирует, как просмотреть пространство имен.

  1. Создайте файл NameClientList.java и импортируйте надлежащие библиотеки:
    import java.util.Properties;
    import org.omg.CORBA.*;
    import org.omg.CosNaming.*;
    
    public class NameClientList
    {
       public static void main(String args[])
       {
          try {
    
  2. В разделе, Запуская Службу Именования, сервер имен запускается на порту 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);
    
    
    
  3. Получите начальный контекст именования.
            NamingContextExt nc = 
              NamingContextExtHelper.narrow(orb.resolve_initial_references(
                "NameService"));
    
    
  4. Перечислите всю привязку в контексте именования.

    list метод перечисляет привязку в контексте именования. В этом случае до 1000 привязки от начального контекста именования будет возвращена в BindingListHolder; любая остающаяся привязка возвращается в BindingIteratorHolder.

     
            BindingListHolder bl = new BindingListHolder();
            BindingIteratorHolder blIt= new BindingIteratorHolder();
            nc.list(1000, bl, blIt);
    
    
  5. Получите массив привязки.

    Этот код вытаскивает массив привязки из возвращенного BindingListHolder.

            Binding bindings[] = bl.value;
    
    
    
  6. Этот код циклы посредством привязки и распечатывает имена.
            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);
           } 
       }
    }
    
  7. Сохраните NameClientList.java, и скомпилируйте файл следующим образом:
         javac NameClientList.java
    

    Исправьте любые синтаксические ошибки перед продолжением.

  8. Удостоверьтесь, что Демон Посредника запросов к объектам работает, клиентское приложение, иллюстрированное в Демонстрационном Клиенте: Добавление Объектов к Пространству имен было выполнено, и клиентское приложение, иллюстрированное в Демонстрационном Клиенте: Разрешение Объектов от Пространства имен было выполнено.
  9. Выполните NameClientList, следующим образом:
         java NameClientList -ORBInitialPort 1050
    

Вывод в окне терминала похож на это:

вывод в окне терминала

Запуск Службы Именования

Во всех учебных руководствах мы используем Демона Посредника запросов к объектам, orbd, который включает и Персистентное и Переходную Службу Именования, и доступен с каждой загрузкой J2SE 1.4 и выше.

Для вызывающей стороны (клиент, коллега, или клиентское приложение), чтобы быть в состоянии вызвать метод на удаленный объект, та вызывающая сторона должна сначала получить ссылку на удаленный объект.

Как только удаленный объект регистрируется на сервере, вызывающие стороны могут искать объект по имени, получить ссылку удаленного объекта, и затем удаленно вызвать методы на объект.

Чтобы изучить, как запустить Службу Именования, см., что тема Запускает Службу Именования в документации ORBD.

Остановка Службы Именования

Чтобы остановить службу именования, используйте соответствующую команду операционной системы, такую как kill на Солярисе, или Ctrl+C в окне DOS, в котором работает orbd. Отметьте, что имена, зарегистрированные в службе именования, могут исчезнуть, когда служба завершается, если служба именования является переходным процессом. Служба именования IDL Java будет работать, пока она не будет явно остановлена.

Именование FAQ Службы

Как я соединяюсь со Службой Именования 3-ьей стороны от ШАРА Sun?

Рекомендуемый путь состоит в том, чтобы использовать Взаимодействующую Службу Именования (INS), если эта опция поддерживается Службой Именования 3-ьей стороны.

Использовать ШАР Sun со Службой Именования другого поставщика,

  1. Запустите сервер имени 3-ьей стороны на Узле <H> и Порт. <P>
  2. Передайте следующий параметр ORB.init():
            -ORBInitRef NameService=corbaloc:iiop:1.2@<H>:<P>/NameService
            
    

Когда Вы делаете orb.resolve_initial_references( "NameService" ), следует быть в состоянии соединиться со службой имен 3-ьей стороны. Если Вы все еще не в состоянии соединиться, попробуйте эти подсказки поиска и устранения неисправностей:


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами