Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации
Содержание | Предыдущий | Следующий Расширения управления Java (JMX) Технологическое Учебное руководство

 Глава 4

Службы поиска

Расширения управления Java (JMX) спецификация определяют три привязки к службам поиска, используя существующие технологии поиска, как описано в следующих разделах:

Службы поиска позволяют технологическим клиентам JMX находить и соединяться с серверами соединителя, которые зарегистрировались в службах поиска.

Начальная Конфигурация

Как показано просто в Разделе "Доступ к Стандартному и Динамическому MBeans через Соединитель RMI", если Вы используете удаленный вызов метода (RMI) соединители, можно хотеть использовать внешний каталог, чтобы зарегистрировать тупики сервера соединителя, которые Вы хотите искать. Следующие случаи представляются в примерах службы поиска, касающихся соединителей RMI:

  • Реестр RMI, для соединителей RMI, реализовывая Java значения по умолчанию Удаленный Протокол Метода (JRMP) транспорт
  • CORBA Именование Службы, для соединителей RMI, реализовывая интернет-Протокол Межшара (IIOP) транспорт
  • Легкий Протокол Доступа Каталога (LDAP), и для IIOP и для транспортов JRMP

Если Вы хотите регистрировать тупики соединителя RMI во внешнем каталоге, некоторая начальная конфигурация требуется, чтобы установить Ваш реестр RMI, CORBA именование службы или сервера LDAP. Если Вы не используете внешний каталог, тупик соединителя RMI кодируется в службу JMX URL.

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

Внешний Реестр RMI

Чтобы зарегистрировать тупики сервера соединителя RMI во внешнем реестре RMI, для использования соединителями, реализовывая транспорт JRMP, выполняют следующие действия:

  1. Запустите реестр RMI на порту 9999 из локального узла.

    Как имел место в  Главе 3, "Соединители JMX", реестр RMI используется, чтобы сохранить тупики соединителя RMI для соединителей RMI, реализовывая транспорт JRMP.

    $ rmiregistry 9999 &

  2. Для Вашего удобства, вводя команды, создайте переменную окружения для адреса реестра RMI.

    Чтобы сократить команды, которые Вы введете, когда Вы выполните примеры, устанавливает службу URL для реестра RMI как переменная окружения, jndirmi. В этих примерах служба URL дается в форме JNDI. См. документацию API для javax.management.remote.rmi пакет для объяснения формы JNDI. Если Вы хотите выполнить внешние каталоги на машине кроме локальной машины, следует определить что имя хоста машины вместо localhost.

    $ jndirmi = "rmi://localhost:9999"

Внешний CORBA Именование Службы

Чтобы зарегистрировать тупики сервера соединителя RMI во внешнем CORBA именование службы, для использования соединителями, реализовывая транспорт IIOP, выполняют следующие действия:

  1. Запустите Посредника запросов к объектам (ШАР) демон на порту 7777 из локального узла.

    Соединители RMI, которые реализуют транспорт IIOP, могут использовать CORBA, называющий, чтобы идентифицировать тупик соединителя RMI.

    $ orbd-ORBInitialPort 7777 &

  2. Для Вашего удобства, вводя команды, создайте переменную окружения для адреса CORBA именование службы.

    Чтобы сократить команды, которые Вы вводите, когда Вы выполняете примеры, устанавливает службу URL для CORBA именование службы как переменная окружения, jndiiiop. В этих примерах служба URL дается в форме JNDI. Если Вы хотите выполнить внешние каталоги на машине кроме локальной машины, следует определить что имя хоста машины вместо localhost.

    $ jndiiiop = "iiop://localhost:7777"

Внешний Реестр LDAP

Чтобы зарегистрировать тупики сервера соединителя RMI во внешнем реестре LDAP, для использования соединителями, реализовывая или JRMP или транспортов IIOP, выполняют следующие действия:

  1. Запустите Сервер LDAP.

    Сервер LDAP, который Вы используете, является Вашим выбором, хотя схема для того, чтобы представить объекты Java в каталоге LDAP должна быть известна серверу. См. соответствующий Запрос На Комментарии (RFC) документ для деталей:

    http://www.ietf.org/rfc/rfc2713.txt

  2. Создайте компонентный суффикс домена.

    Эти примеры требуют, чтобы Вы создали следующий компонентный суффикс домена:

    dc=Test

    См., что документация сопровождает Ваш сервер LDAP для деталей того, как сконфигурировать сервер и создать этот суффикс.

  3. Для Вашего удобства, набор следующие параметры LDAP как переменные окружения.

    Эти переменные используются, чтобы сократить команды, которые Вы вводите, запуская классы Сервера и Клиента в примерах службы поиска, которые регистрируют тупики соединителя RMI во внешнем сервере LDAP.

    1. Имя машины, выполняющей Ваш сервер LDAP (ldap_host)

      $ ldaphost=ldap_host

    2. Порт сервер LDAP работает (ldap_port)

      $ ldapport=ldap_port

    3. Атрибут общего названия LDAP, который в этих примерах является “менеджером по Каталогу”

      $ принципал = ”cn=Directory менеджер”

    4. Пароль требуется Вашим сервером LDAP

      Предоставьте пароль для своего сервера LDAP.

      $ credentials=your_ldap_password

    5. Адрес сервера LDAP

      В этом примере формируется служба, которую URL для сервера LDAP дается в JNDI, и идентифицируется переменной jndildap.

      $ jndildap = "ldap://$ldapport $ldaphost:"

    • Вы теперь готовы выполнить различные примеры службы поиска.

Протокол обнаружения сервисов (SLP) Служба Поиска

Технология JMX определяет, как зарегистрировать соединители RMI в службе поиска SLP.

Цель этого примера состоит в том, чтобы демонстрировать, как JMX Удаленный клиент соединителя API может найти и соединиться с сервером соединителя, который зарегистрировался в службе поиска SLP. Этот пример выполняет следующие операции:

  • Агент:
  • Создает сервер MBean
  • Получает указатель на службу поиска SLP
  • Создает сервер соединителя
  • Регистрирует адрес соединителя в службе поиска SLP
  • Клиент:
  • Получает указатель на службу поиска SLP
  • Ищет любые серверы соединителя, зарегистрированные в службе поиска SLP
  • Создает JMX Удаленный соединитель API
  • Получает информацию о MBeans в сервере MBean

Этот пример предполагает, что Вы уже знакомы с технологией SLP. Код, предусмотренный, этот пример соответствует реализации Sun Microsystems SLP, как определено RFC 2614 (см. http://www.ietf.org/rfc/rfc2614.txt). Реализация Sun Microsystems SLP доступна в операционной среде Соляриса в каталоге/usr/share/lib/slp. Если Вы не выполняете операционную среду Соляриса, следует получить версию SLP, который совместим с RFC 2614, раздел 5. Можно загрузить реализацию Java OpenSLP с http://www.openslp.org/.

Пример поиска SLP содержится в каталоге work_dir/jmx_examples/Lookup/slp.

  1. Открытый work_dir/jmx_examples/Lookup/slp.

    В этом каталоге Вы найдете следующие файлы:

    • Server.java
    • Client.java
    • README
  2. Откройте обоих *.java файлы в текстовом редакторе.

    Эти классы будут проанализированы в следующих разделах.

Анализ Классов В качестве примера

Следующие разделы анализируют каждый из классов, используемых в примере поиска SLP, и объясняют, как они выполняют операции, описанные выше.


Отметьте – Если Вы используете реализацию SLP кроме реализации Sun Microsystems, необходимо изменить Server.java и Client.java импортировать Вашу версию классов Java SLP вместо com.sun.slp пакет. См. RFC 2614, раздел 5.

Server.java

Из-за его размера, службы поиска SLP Server.java class показывают как серия выборок кода. Для объяснений кода SLP, используемого в этом примере, см. RFC 2614 и документацию API для SLP.

 ПРИМЕР КОДА 4-1 Класс Службы Поиска В качестве примера SLP Server.java (Выборка 1)
 
public class Server { 
   public final static int JMX_DEFAULT_LEASE = 300; 
   public final static String JMX_SCOPE = "DEFAULT"; 
 
   private final MBeanServer mbs; 
   public Server() { 
       mbs = MBeanServerFactory.createMBeanServer(); 
   } 
    
[...] 
 

 ПРИМЕР КОДА 4-1 набор значение по умолчанию арендный договор SLP JMX_DEFAULT_LEASE к арендному договору значения по умолчанию относительно 300 секунд соответствуя отрезку времени URL будет зарегистрирован, и показывает начальное создание сервера MBean mbs.

В коде, который не показывают здесь, Вы тогда определяете рекламодателя SLP slpAdvertiser, и служба SLP URL url. slpAdvertiser используется, чтобы зарегистрировать службу URL в службе поиска SLP. SCOPE и agentName регистрируются в SLP как атрибуты поиска.

 ПРИМЕР КОДА 4-2 Класса Службы Поиска В качестве примера SLP Server.java (Выборка 2)
 
[...] 
 
   public static void register(JMXServiceURL jmxUrl, String name) 
     throws ServiceLocationException { 
     ServiceURL serviceURL = 
          new ServiceURL(jmxUrl.toString(), 
                         JMX_DEFAULT_LEASE); 
     debug("ServiceType is: " + serviceURL.getServiceType()); 
     Vector attributes = new Vector(); 
     Vector attrValues = new Vector(); 
     attrValues.add(JMX_SCOPE); 
     ServiceLocationAttribute attr1 = 
          new ServiceLocationAttribute("SCOPE", attrValues); 
     attributes.add(attr1); 
     attrValues.removeAllElements(); 
     attrValues.add(name); 
     ServiceLocationAttribute attr2 = 
          new ServiceLocationAttribute("AgentName", attrValues); 
     attributes.add(attr2); 
     final Advertiser slpAdvertiser = 
          ServiceLocationManager.getAdvertiser(Locale.US); 
     slpAdvertiser.register(serviceURL, attributes); 
      
   }  
 
[...] 
 

 ПРИМЕР КОДА 4-2 шоу регистрация сервера соединителя JMX URL со службой поиска SLP.

Служба JMX URL jmxUrl адрес сервера соединителя, и получается звонком getAddress() метод JMXConnectorServer когда сервер соединителя запускается.

Атрибуты поиска SLP, а именно, контекст и агент называют, под которым должен быть зарегистрирован адрес сервера соединителя (name), тогда определяются class SLP ServiceLocationAttribute. AgentName атрибут является обязательными, но другими дополнительными атрибутами, такой как ProtocolType, AgentHost, и Property может также быть зарегистрирован в службе поиска SLP.

Наконец, адрес сервера соединителя JMX регистрируется в службе SLP со звонком register() метод Advertiser интерфейс, с serviceURL и attributes переданный в как параметры.

 ПРИМЕР КОДА 4-3 Класса Службы Поиска В качестве примера SLP Server.java (Выборка 3)
 
[...] 
 
   public JMXConnectorServer rmi(String url) throws 
     IOException, 
     JMException, 
     NamingException, 
     ClassNotFoundException, 
     ServiceLocationException { 
     JMXServiceURL jurl = new JMXServiceURL(url); 
     final HashMap env = new HashMap(); 
     // Environment map attributes 
     [...] 
 
  
     JMXConnectorServer rmis = 
        JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs); 
     final String agentName = System.getProperty("agent.name", 
                                                 "DefaultAgent"); 
     start(rmis, agentName); 
 
     return rmis; 
  } 
[...] 
 

 ПРИМЕР КОДА 4-3 шоу создание сервера соединителя RMI. Служба JMX URL jurl создается из строки url это включается в команду, используемую, чтобы запуститься Server в командной строке. Сервер соединителя RMI называют rmis тогда создается с системными свойствами, определенными средой map и адрес jurl.

Сервер соединителя тогда запускается, и адрес сервера соединителя RMI регистрируется в службе поиска SLP под именем agentName.

 ПРИМЕР КОДА 4-4 Класса Службы Поиска В качестве примера SLP Server.java (Выборка 4)
 
[...] 
 
   public void start(JMXConnectorServer server, String agentName) 
      throws IOException, ServiceLocationException { 
      server.start(); 
      final JMXServiceURL address = server.getAddress(); 
      register(address,agentName); 
   } 
    
[...] 
 

 ПРИМЕР КОДА 4-4 шоу запуск сервера соединителя server и регистрация server в службе поиска SLP с данным адресом address.

Client.java

Служба поиска SLP Client.java class показывают в  ПРИМЕРЕ КОДА 4-1,  ПРИМЕР КОДА 4-2, и  ПРИМЕР КОДА 4-3:

 ПРИМЕР КОДА 4-1 Класс Службы Поиска В качестве примера SLP Client.java (Выборка 1)
 
public class Client { 
 
    public final static String JMX_SCOPE = "DEFAULT"; 
 
    public static Locator getLocator() throws ServiceLocationException { 
      final Locator slpLocator = 
          ServiceLocationManager.getLocator(Locale.US); 
      return slpLocator; 
    } 
     
      public static List lookup(Locator slpLocator, String name) 
          throws IOException, ServiceLocationException { 
 
   
          final ArrayList list = new ArrayList(); 
          Vector scopes = new Vector(); 
 
          scopes.add(JMX_SCOPE); 
          String query =  
              "(&(AgentName=" + ((name!=null)?name:"*") + "))"; 
 
          ServiceLocationEnumeration result = 
              slpLocator.findServices(new ServiceType("service:jmx"), 
                                      scopes, query); 
 
          while(result.hasMoreElements()) { 
                final ServiceURL surl = (ServiceURL) result.next(); 
                 
 
             JMXServiceURL jmxUrl = new JMXServiceURL(surl.toString()); 
             try { 
                  JMXConnector client = 
                     JMXConnectorFactory.newJMXConnector(jmxUrl,null); 
                  if (client != null) list.add(client); 
             } catch (IOException x ) {  
             [...] 
             } 
          } 
      } 
      return list; 
    } 
 

 ПРИМЕР КОДА 4-1 прежде всего получает службу SLP Locator вызывая getLocator метод class SLP ServiceLocationManager. Client тогда получает все серверы соединителя, зарегистрированные в службе SLP под данным именем агента, или под именами агента, которые соответствуют определенный образец. Если никакое имя агента не определяется когда Client запускается, все имена агента рассмотрят.

Технологическая служба JMX URL, jmxUrl, сгенерирован для каждого из агентов, полученных SLP, со службой каждого агента SLP URL, surl, переданный в качестве параметра в JMXServiceURL экземпляр. URL jmxUrl тогда передается к newJMXConnector() метод JMXConnectorFactory, создать новый названный клиент соединителя client для каждого агента, который регистрируется в службе SLP.

Клиенты соединителя получали, сохранены в вызванном списке массива list.

 ПРИМЕР КОДА 4-2 Класса Службы Поиска В качестве примера SLP Client.java (Выборка 2)
 
public static void listMBeans(MBeanServerConnection server) 
     throws IOException { 
 
     final Set names = server.queryNames(null,null); 
     for (final Iterator i=names.iterator(); i.hasNext(); ) { 
          ObjectName name = (ObjectName)i.next(); 
          System.out.println("Got MBean: "+name); 
          try { 
               MBeanInfo info = 
                  server.getMBeanInfo((ObjectName)name); 
               MBeanAttributeInfo[] attrs = info.getAttributes(); 
               if (attrs == null) continue; 
               for (int j=0; j<attrs.length; j++) { 
                    try { 
                         Object o = 
                         server.getAttribute(name,attrs[j].getName()); 
                         System.out.println("\t\t" + attrs[j].getName() + 
                         " = "+o); 
                    } catch (Exception x) { 
                         System.err.println("JmxClient failed to get " + 
                                             attrs[j].getName() + x); 
                         x.printStackTrace(System.err); 
                    } 
     } 
} 
 

В  ПРИМЕРЕ КОДА 4-2, ссылке на MBeanServerConnection получается для каждого клиента соединителя, который создается из адреса сервера соединителя, сохраненного в службе SLP. Список всего MBeans и их атрибутов получается.

 ПРИМЕР КОДА 4-3 Класса Службы Поиска В качестве примера SLP Client.java (Выборка 3)
 
public static void main(String[] args) { 
      try { 
           final String agentName = System.getProperty("agent.name"); 
           final Locator slpLocator = getLocator(); 
           List l = lookup(slpLocator,agentName); 
           int j = 1; 
           for (Iterator i=l.iterator();i.hasNext();j++) { 
                JMXConnector c1 = (JMXConnector) i.next(); 
                if (c1 != null) { 
                    try { 
                         c1.connect(env); 
                    } catch (IOException x) { 
                         System.err.println ("Connection failed: " + x); 
                         x.printStackTrace(System.err); 
                         continue; 
                    } 
 
                    MBeanServerConnection conn = 
                         c1.getMBeanServerConnection(); 
 
                    try { 
                         listMBeans(conn); 
                    } catch (IOException x) { 
                         x.printStackTrace(System.err); 
                    } 
                    try { 
                         c1.close(); 
                    } catch (IOException x) { 
                         x.printStackTrace(System.err); 
                    } 
                } 
           } 
      } catch (Exception x) { 
           x.printStackTrace(System.err); 
      } 
} 
 

В  ПРИМЕРЕ КОДА 4-3, agent.name свойство получается, вызывая getProperty() метод System class, и служба поиска SLP находятся, вызывая getLocator() метод Locator.

Все агенты называют agentName тогда ищутся, и соединения делаются к обнаруженным агентам. Если никакой агент не определяется, то все агенты являются поиском. Соединения делаются к серверу MBean, создаваемому Server, и все MBeans в этом перечисляются, прежде, чем соединение закрывается.

Выполнение Примера Службы Поиска SLP

В дополнение к действиям Вы выполняли в Разделе "Начальную Конфигурацию", прежде, чем можно будет выполнить примеры службы поиска, которые используют SLP, следует выполнить некоторые дальнейшие начальные действия, которые являются определенными для этого примера. Можно тогда начать искать соединители, используя SLP в соединении с этими двумя соединителями, поддерживаемыми технологией JMX.

Когда Вы выполняете примеры, чтобы помочь Вам отследить, из которых был создан агент, с которым транспортом, имена агента включают суффикс буквы, который является тем же самым как надписью соответствующего раздела. Например, агент от Раздела a. "Соединитель RMI по JRMP, без внешнего каталога" вызывают example-server-a.

Установка Примера Службы Поиска SLP

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

  1. Для удобства, компилируя и выполняя классы, определите дополнительную переменную окружения.

    В дополнение к общим переменным окружения, которые были установлены в Разделе "Начальная Конфигурация", Вы должны добавить путь к службе SLP. Если Вы используете операционную среду Соляриса, добавьте следующую переменную:

    $ SLPLIB =/usr/share/lib/slp

    Если Вы используете другую платформу, набор SLPLIB соответственно для платформы Вы используете.

  2. Определите и экспортируйте classp переменная окружения.

    Этот пример требует пути к классу, который включает архив Java (JAR) файлы для SLP.

    $ $SLPLIB/slp.jar classp=

  3. Скомпилируйте пример Client и Server классы.

    Введите следующую команду:

    $ javac-d. - $classp пути к классу Server.java Client.java

  4. Запустите демона SLP.

    Если Вы используете операционную среду Соляриса, введите следующую команду, которая требует, чтобы Вы знали свой пользовательский пароль высшего качества:

    $ su базируются-c "java - $SLPLIB/slpd.jar CP com.sun.slp.slpd &"

    Password: [введите пароль суперпользователя]

    Если Вы не выполняете систему Соляриса, запустите демона SLP согласно реализации SLP, который Вы используете.

Выполнение Примера Службы Поиска SLP

Этот пример демонстрирует использование службы поиска SLP, чтобы искать серверы соединителя RMI, которые используют транспорт значения по умолчанию RMI, JRMP, так же как транспорт IIOP. Кроме того, как описано в Разделе "Начальная Конфигурация", различные внешние каталоги используются, чтобы зарегистрировать тупики соединителя RMI.

Комбинации транспортов и внешних каталогов, демонстрируемых здесь:

  • Соединитель RMI по транспорту JRMP, с:
  • Никакой внешний каталог
  • Реестр RMI
  • Реестр LDAP
  • Соединитель RMI по транспорту IIOP, с:
  • Никакой внешний каталог
  • CORBA именование службы
  • Реестр LDAP

Выполните следующие шаги, чтобы выполнить пример:

  1. Запустите Server.

    Команда Вы используете, чтобы запустить Server изменяется, согласно которому внешнему каталогу Вы используете. Можно запустить один или больше следующих экземпляров Server с различными транспортами и внешними реестрами прежде, чем запуститься Client.

    1. Соединитель RMI по JRMP, без внешнего каталога

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-a \ 
        -Durl ="service:jmx:rmi://" \ 
        slp.Server & 
       
      

      В этой команде:

      • debug устанавливается в истину обеспечить более полный экранный вывод когда Server выполнения
      • Имя агента, который будет создан, example-server-a
      • URL службы определяет, что выбранный соединитель является соединителем RMI, работая на основе транспорта значения по умолчанию RMI JRMP.

      Когда Сервер будет запущен, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе SLP.

    2. Соединитель RMI по JRMP, используя реестр RMI в качестве внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-b \ 
        -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \ 
        slp.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-b
      • Служба URL определяет выбранный соединитель как RMI по JRMP, и внешний каталог, в котором сохранен тупик соединителя RMI, сервер, является реестром RMI, который Вы идентифицировали как jndirmi в Разделе "Начальная Конфигурация".

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе SLP.

    3. Соединитель RMI по JRMP, используя LDAP в качестве внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-c \ 
        -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x,dc=Test" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        slp.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-c
      • Служба URL определяет выбранный соединитель как RMI по JRMP, и внешний каталог, в котором сохранен тупик соединителя RMI, является сервером LDAP, который Вы идентифицировали как jndildap в Разделе "Начальная Конфигурация".
      • Тупик регистрируется в Test компонент домена в сервере LDAP.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе SLP под именем агента example-server-c.

    4. Соединитель RMI по IIOP, без внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-d \ 
        -Durl="service:jmx:iiop://" \ 
        slp.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-d
      • Служба URL определяет выбранный соединитель как соединитель RMI по IIOP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его автоматически сгенерированного URL в службе SLP.

    5. Соединитель RMI по IIOP, используя CORBA, называющий как внешний каталог.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-e \ 
        -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \ 
        slp.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-e
      • Служба URL определяет выбранный соединитель как соединитель RMI по IIOP. Внешний каталог тот, в который тупик соединителя RMI server сохранен CORBA именование службы, которую Вы идентифицировали как jndiiiop в Разделе "Начальная Конфигурация"

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе SLP под именем example-server-e.

    6. Соединитель RMI по IIOP, используя LDAP в качестве внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-f \ 
        -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x,dc=Test" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        slp.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-f
      • Служба URL определяет выбранный соединитель как RMI по IIOP, и внешний каталог, в котором сохранен тупик соединителя RMI, является сервером LDAP, который Вы идентифицировали как jndildap в Разделе "Начальная Конфигурация".
      • Тупик регистрируется в Test компонент домена в сервере LDAP.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе SLP под именем агента example-server-f.

    • Запустите Client.
    • После запуска Server используя транспортный и внешний каталог Вашего выбора, запустите Client:

       
      $ java -classpath .:$classp -Ddebug=true \ 
           -Djava.naming.security.principal="$principal" \ 
           -Djava.naming.security.credentials="$credentials" \ 
           slp.Client 
       
      

      Вы будете видеть, что вывод подтверждает обнаружение агентов, создаваемых Server и зарегистрированный в службе поиска. Вы будете также видеть идентификацию и подтверждение соединения, сделанного к агентам.

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

       
      $ java -classpath .:$classp -Ddebug=true \ 
           -Djava.naming.security.principal="$principal" \ 
           -Djava.naming.security.credentials="$credentials" \ 
           -Dagent.name="agentName" \ 
          slp.Client 
       
      

      В команде, показанной выше, agentName является именем агента, который Вы хотите искать. Можно также определить частичное имя агента при использовании *; например, x* для всех имен агента, начинающихся с буквы x.

Служба Поиска Jini

Цель этого примера состоит в том, чтобы демонстрировать, как технологический клиент соединителя JMX может найти и соединиться с сервером соединителя, который зарегистрировался в службе поиска Jini. Этот пример выполняет следующие операции:

  • Агент:
  • Создает сервер MBean
  • Создает сервер соединителя
  • Регистрирует адрес соединителя в службе поиска Jini
  • Клиент:
  • Получает указатель на службу поиска Jini
  • Ищет любые серверы соединителя, зарегистрированные в службе поиска Jini
  • Создает JMX Удаленный соединитель API
  • Получает информацию о MBeans в сервере MBean

Пример службы поиска Jini содержится в каталоге work_dir/jmx_examples/Lookup/jini.


Отметьте – Эти примеры предполагают, что Вы уже знакомы с технологией сети Jini. Документация для технологии сети Jini доступна в http://java.net/projects/jini. Можно загрузить технологию сети Jini с http://java.net/projects/jini. Этот пример был реализован, используя Технологическую Версию 1.2.1_002 Стартового набора Jini.
  1. Откройте work_dir/jmx_examples/Lookup/jini каталог.

    В этом каталоге Вы найдете следующие файлы:

    • Server.java
    • Client.java
    • java.policy
    • jini.properties.template
    • README
  2. Откройте каждый из файлов в текстовом редакторе.

    Эти классы будут проанализированы в следующих разделах.

Анализ Классов В качестве примера

Следующие разделы анализируют каждый из классов, используемых в примере службы поиска Jini, и объясняют, как они выполняют операции, описанные выше.

Server.java

Из-за его размера, службы поиска Jini Server.java class показывают как серия выборок кода.

 ПРИМЕР КОДА 4-1 Класс Службы Поиска В качестве примера Jini Server.java (Выборка 1)
 
 
public class Server { 
   private final MBeanServer mbs; 
   private static boolean debug = false; 
   public Server() { 
     mbs = MBeanServerFactory.createMBeanServer(); 
   } 
 
[...] 
 

 ПРИМЕР КОДА 4-1 шоу создание сервера MBean mbs. Как имел место для примеров SLP, служба JMX, к URL и имени агента передают Server когда это запускается в командной строке.

 ПРИМЕР КОДА 4-2 Класса Службы Поиска В качестве примера Jini Server.java (Выборка 2)
 
 
[...] 
 
   public JMXConnectorServer rmi(String url) 
      throws IOException, JMException, ClassNotFoundException { 
      JMXServiceURL jurl = new JMXServiceURL(url); 
      final HashMap env = new HashMap(); 
      // Environment map attributes 
     [...] 
     JMXConnectorServer rmis = 
        JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs); 
 
     final String agentName = System.getProperty("agent.name", 
                                                 "DefaultAgent"); 
 
     start(rmis,env,agentName); 
 
     return rmis; 
   } 
    
[...] 
 

 ПРИМЕР КОДА 4-2 шоу создание сервера соединителя RMI называют rmis, использование системных свойств определяется картой среды env и адрес jurl.

Сервер соединителя RMI rmis запускается. Адрес сервера соединителя RMI регистрируется в службе поиска Jini под именем agentName.

 ПРИМЕР КОДА 4-3 Класса Службы Поиска В качестве примера Jini Server.java (Выборка 3)
 
[...] 
 
   public void start(JMXConnectorServer server, Map env, String agentName) 
      throws IOException, ClassNotFoundException { 
      server.start(); 
      final ServiceRegistrar registrar=getRegistrar(); 
      final JMXConnector proxy = server.toJMXConnector(env); 
      register(registrar,proxy,agentName); 
   } 
    
   public static ServiceRegistrar getRegistrar() 
      throws IOException, ClassNotFoundException, 
         MalformedURLException { 
      final String jurl = 
         System.getProperty("jini.lookup.url","jini://localhost"); 
      final LookupLocator lookup = new LookupLocator(jurl); 
      final ServiceRegistrar registrar = lookup.getRegistrar(); 
      if (registrar instanceof Administrable) 
          debug("Registry is administrable."); 
      return registrar; 
   } 
    
   public static ServiceRegistration register(ServiceRegistrar registrar, 
                                              JMXConnector proxy, String name) 
      throws IOException { 
      Entry[] serviceAttrs = new Entry[] { 
              new net.jini.lookup.entry.Name(name) 
                       }; 
                        
      System.out.println("Registering proxy: AgentName=" + name ); 
      debug("" + proxy); 
      ServiceItem srvcItem = new ServiceItem(null, proxy, serviceAttrs); 
      ServiceRegistration srvcRegistration = 
             registrar.register(srvcItem, Lease.ANY); 
      debug("Registered ServiceID: " + 
                              srvcRegistration.getServiceID().toString()); 
      return srvcRegistration; 
   } 
    
[...] 
 

 ПРИМЕР КОДА 4-3 шоу создание сервера соединителя называют server с картой среды env и служба URL jurl. Сервер экземпляра сервера соединителя тогда получает указатель на службу поиска Jini, вызывая метод службы поиска Jini LookupLocator.getRegistrar().

Сервер соединителя регистрируется в службе поиска Jini в форме прокси, используя локатор службы поиска Jini registrar и агент называет, под которым будет зарегистрирован сервер соединителя. Прокси является фактически клиентским тупиком для сервера соединителя, полученного звонком toJMXConnector() метод JMXConnectorServer.

Сама регистрация выполняется звонком register() метод службы поиска Jini class ServiceRegistrar, с массивом элементов службы.

Client.java

Пример службы поиска Jini class Client.java показывается в  ПРИМЕРЕ КОДА 4-1.

 ПРИМЕР КОДА 4-1 Класс Службы Поиска В качестве примера Jini Client.java
 
 
public class Client { 
 
   private static boolean debug = false; 
   public static ServiceRegistrar getRegistrar() 
       throws IOException, ClassNotFoundException, MalformedURLException { 
       final String jurl = 
                  System.getProperty("jini.lookup.url","jini://localhost"); 
       final LookupLocator lookup = new LookupLocator(jurl); 
       final ServiceRegistrar registrar = lookup.getRegistrar(); 
       if (registrar instanceof Administrable) 
               debug("Registry is administrable."); 
       return registrar; 
 } 
 
   public static List lookup(ServiceRegistrar registrar, 
           String name) throws IOException { 
       final ArrayList list = new ArrayList(); 
       final Class[] classes = new Class[] {JMXConnector.class}; 
       final Entry[] serviceAttrs = new Entry[] { 
           new net.jini.lookup.entry.Name(name) 
   }; 
    
   ServiceTemplate template = 
        new ServiceTemplate(null,classes,serviceAttrs); 
   ServiceMatches matches = 
        registrar.lookup(template, Integer.MAX_VALUE); 
   for(int i = 0; i < matches.totalMatches; i++) { 
        debug("Found Service: " + matches.items[i].serviceID); 
        if (debug) { 
           if (matches.items[i].attributeSets != null) { 
                   final Entry[] attrs = matches.items[i].attributeSets; 
                   for (int j = 0; j < attrs.length ; j++) { 
                       debug("Attribute["+j+"]=" + attrs[j]); 
               } 
           } 
        } 
 
 
        if(matches.items[i].service != null) { 
            JMXConnector c = (JMXConnector)(matches.items[i].service); 
            debug("Found a JMXConnector: " + c); 
            list.add(c); 
        } 
   } 
   return list; 
} 
 
[...] 
 

 ПРИМЕР КОДА 4-1 шоу, как клиент соединителя получает указатель на службу поиска Jini со звонком lookup.getRegistrar(). Клиент тогда получает список соединителей, зарегистрированных как записи в службе поиска Jini с именем агента name. В отличие от этого в примере SLP, имя агента Вы передаете к Client то, когда это запускается, должно быть или точным совпадением существующего имени агента, или нулем, когда служба поиска Jini будет искать все агенты.

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

java.policy

java.policy файл является технологическим файлом политики безопасности Java, сконфигурированным для этого примера.

jini.properties.template

Шаблон Jini, объединяющий технологический файл свойств в сеть, чтобы быть сконфигурированным для этого примера. Измените @INSTALL_HOME_FOR_JINI и переименуйте файл к jini.properties.

Выполнение Примера Службы Поиска Jini

В дополнение к действиям Вы выполняли в Разделе "Начальную Конфигурацию", прежде, чем можно будет выполнить примеры службы поиска, которые используют службу поиска Jini, следует выполнить некоторые дальнейшие начальные действия, которые являются определенными для этого примера. Можно тогда начать искать соединители, используя технологию сети Jini в соединении с соединителем, поддерживаемым технологией JMX.

Когда Вы выполняете примеры, чтобы помочь Вам отследить, из которых был создан агент, с которым транспортом, имена агента включают суффикс буквы, который является тем же самым как надписью соответствующего раздела. Например, агент от Раздела a. "Соединитель RMI по JRMP, без внешнего каталога." вызывается example-server-a.

Установка Примера Службы Поиска Jini

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

  1. Для Вашего удобства, компилируя и выполняя классы в качестве примера, определите некоторые дополнительные переменные окружения.

    В дополнение к общим переменным окружения, что Вы устанавливаете в Разделе "Начальную Конфигурацию", можно добавить путь к службе поиска Jini. Каталог, где Вы установили Jini, объединяющий технологию в сеть, упоминается как jini_dir.

    $ JINI_HOME=jini_dir

    $ $JINI_HOME/lib JINILIB=

  2. Определите classp переменная окружения.

    Этот пример требует файлов JAR для ядра служб поиска Jini и расширений.

    $ classp=$JINILIB/jini-core.jar:$JINILIB/jini-ext.jar

  3. Создайте a jini.properties файл.

    Файл свойств для платформ UNIX обеспечивается в том же самом каталоге как классы для этого примера. Если Вы не выполняете платформу UNIX, можно получить файл свойств для своей платформы в следующем каталоге:

    $JINI_HOME/example/launcher/jini12_<platform>.properties

  4. Обновите jini.properties файл.

    Следует завершить файл, чтобы включать все необходимые пути, имена хоста и номера портов для Вашей системы. Даже если Вы не выполняете платформу UNIX, можно использовать шаблон, обеспеченный в качестве руководства.

  5. Запустите Jini, объединяющий технологию в сеть StartService.

    $ java - $JINILIB/jini-examples.jar CP com.sun.jini.example.launcher.StartService &

    Это откроется StartService графический интерфейс пользователя.

  6. Загрузите Ваш jini.properties файл в StartService.

    Щелкните 'по Файлу', ‘Открытый Файл свойств’ и затем выберите свой файл свойств изнутри work_dir/jmx_examples/Lookup/jini.

  7. Запустите службы поиска Jini.

    Запустите необходимые службы поиска Jini, щелкая по вкладке ‘Run’ и затем требуя у кнопки ‘START’ каждого следующего:

    • RMID
    • WebServer
    • Реджи
    • LookupBrowser

    Вы будете видеть подтверждение, что службы работают.

  8. Скомпилируйте Client и Server классы.

    Введите следующую команду:

    $ javac-d. - $classp пути к классу Server.java Client.java

Выполнение Примера Службы Поиска Jini

Этот пример демонстрирует использование службы поиска Jini, чтобы искать серверы соединителя RMI, которые используют транспорт значения по умолчанию RMI, JRMP, так же как транспорт IIOP. Кроме того, как описано в Разделе "Начальная Конфигурация", различные внешние каталоги используются, чтобы зарегистрировать тупики соединителя RMI.

Комбинации транспортов и внешних каталогов, демонстрируемых здесь:

  • Соединитель RMI по транспорту JRMP, с:
  • Никакой внешний каталог
  • Реестр RMI
  • Реестр LDAP
  • Соединитель RMI по транспорту IIOP, с:
  • Никакой внешний каталог
  • CORBA именование службы
  • Реестр LDAP
  1. Запустите Server.

    Команда Вы используете, чтобы запустить Server изменяется, согласно которому внешнему каталогу Вы используете. Можно запустить один или больше следующих экземпляров Server с различными транспортами и внешними реестрами прежде, чем запуститься Client.

    1. Соединитель RMI по JRMP, без внешнего каталога.

      Запустите Сервер, вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-a \ 
        -Durl="service:jmx:rmi://" \ 
        -Djava.security.policy=java.policy \ 
        jini.Server & 
       
      

      В этой команде:

      • debug устанавливается в true обеспечить более полный экранный вывод когда Server выполнения.
      • Политика безопасности обеспечивается, чтобы предоставить доступ к службе поиска Jini.
      • Имя агента, который будет создан, example-server-a.
      • URL службы определяет, что выбранный соединитель является соединителем RMI, работая на основе транспорта значения по умолчанию RMI JRMP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска Jini.

    2. Соединитель RMI по JRMP, используя реестр RMI в качестве внешнего каталога.

      Запустите Сервер, вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-b \ 
        -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \ 
        -Djava.security.policy=java.policy \ 
        jini.Server & 
       
      

      В этой команде:

      • Политика безопасности обеспечивается, чтобы предоставить доступ к службе поиска Jini.
      • Имя создаваемого агента example-server-b.
      • Служба URL определяет выбранный соединитель как RMI по JRMP, и внешний каталог в который тупик соединителя RMI, server, сохранен реестр RMI, который Вы идентифицировали как jndirmi в Разделе "Начальная Конфигурация".

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска Jini.

    3. Соединитель RMI по JRMP, используя LDAP в качестве внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-c \ 
        -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x,dc=Test" \ 
        -Djava.security.policy=java.policy \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jini.Server & 
       
      

      В этой команде:

      • Политика безопасности обеспечивается, чтобы предоставить доступ к службе поиска Jini.
      • Имя создаваемого агента example-server-cСлужба.The URL определяет выбранный соединитель как RMI по JRMP, и внешний каталог, в котором сохранен тупик соединителя RMI, является сервером LDAP, который Вы идентифицировали как jndildap в Разделе "Начальная Конфигурация".
      • Тупик регистрируется в Test компонент домена в сервере LDAP.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска Jini под именем агента example-server-c.

    4. Соединитель RMI по IIOP, без внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-d \ 
        -Durl="service:jmx:iiop://" \ 
        -Djava.security.policy=java.policy \ 
        jini.Server & 
       
      

      В этой команде:

      • Политика безопасности обеспечивается, чтобы предоставить доступ к службе поиска Jini
      • Имя создаваемого агента example-server-d
      • Служба URL определяет выбранный соединитель как соединитель RMI по IIOP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его автоматически сгенерированного URL в службе поиска Jini.

    5. Соединитель RMI по IIOP, используя CORBA, называющий как внешний каталог.

      Запустить Server вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-e \ 
        -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \ 
        -Djava.security.policy=java.policy \ 
        jini.Server & 
       
      

      В этой команде:

      • Политика безопасности обеспечивается, чтобы предоставить доступ к службе поиска Jini.
      • Имя создаваемого агента example-server-e.
      • Служба URL определяет выбранный соединитель как соединитель RMI по IIOP. Внешний каталог тот, в который тупик соединителя RMI, server, сохранен CORBA именование службы, которую Вы идентифицировали как jndiiiop в Разделе "Начальная Конфигурация".

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска Jini под именем example-server-e.

    6. Соединитель RMI по IIOP, используя LDAP в качестве внешнего каталога.

      Запустите Сервер, вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Dagent.name=example-server-f \ 
        -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x,dc=Test" \ 
        -Djava.security.policy=java.policy \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jini.Server & 
       
      

      В этой команде:

      • Политика безопасности обеспечивается, чтобы предоставить доступ к службе поиска Jini.
      • Имя создаваемого агента example-server-f.
      • Служба URL определяет выбранный соединитель как RMI по IIOP.
      • Тупик регистрируется в Test компонент домена в сервере LDAP.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска Jini под именем агента example-server-f.

    • Запустите Client.
    • После запуска Server используя транспортный и внешний каталог Вашего выбора, запустите Client:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Djava.security.policy=java.policy \ 
        jini.Client 
       
      

      Вы будете видеть, что вывод подтверждает обнаружение агентов, создаваемых Server и зарегистрированный в службе поиска. Вы будете также видеть идентификацию и подтверждение соединения, сделанного к агентам.

      Чтобы искать определенный агент, можно сделать так, вводя следующую команду:

       
      $ java -classpath .:$classp -Ddebug=true \ 
        -Djava.security.policy=java.policy \ 
        -Dagent.name=agentName \ 
        jini.Client 
       
      

      В команде, показанной выше, agentName является именем агента, который Вы хотите искать. Можно также определить частичное имя агента при использовании *; например, x* для всех имен агента, начинающихся с буквы x.

Именование Java и Интерфейс Каталога (JNDI) / Служба Поиска LDAP

Технология JMX позволяет Вам регистрировать соединители RMI в службе поиска JNDI, используя реестр LDAP в качестве бэкэнда. Этот пример выполняет следующие операции:

  • Агент:
  • Создает сервер MBean
  • Создает сервер соединителя
  • Регистрирует адрес соединителя в сервере LDAP
  • Клиент:
  • Получает указатель на Службу поиска JNDI/LDAP
  • Ищет любые серверы соединителя, зарегистрированные в службе поиска JNDI/LDAP
  • Создает JMX Удаленный соединитель API
  • Получает информацию о MBeans в сервере MBean

Пример поиска JNDI/LDAP содержится в каталоге work_dir/jmx_examples/Lookup/ldap.

  1. Откройте work_dir/jmx_examples/Lookup/ldap каталог.

    В этом каталоге Вы найдете следующие файлы:

    • Server.java
    • Client.java
    • jmx-schema.txt
    • 60jmx-schema.ldif
    • README
  2. Откройте файлы в текстовом редакторе.

    Эти классы будут проанализированы в следующих разделах.

Анализ Классов В качестве примера

Следующие разделы анализируют каждый из классов, используемых в примере службы поиска JNDI/LDAP, и объясняют, как они выполняют операции, описанные выше.

Server.java

Из-за его размера, службы поиска JNDI/LDAP Server.java class показывают как серия выборок кода.

 ПРИМЕР КОДА 4-1 Пример Службы Поиска JNDI/LDAP Server.java (Выборка 1)
 
[...] 
 
public class Server { 
   public final static int JMX_DEFAULT_LEASE = 60; 
   private static boolean debug = false; 
   private final MBeanServer mbs; 
   public Server() { 
      mbs = MBeanServerFactory.createMBeanServer(); 
   } 
 
  public static DirContext getRootContext() throws NamingException { 
      final Hashtable env = new Hashtable(); 
 
      final String factory = 
        System.getProperty(Context.INITIAL_CONTEXT_FACTORY, 
                           "com.sun.jndi.ldap.LdapCtxFactory"); 
      final String ldapServerUrl = 
        System.getProperty(Context.PROVIDER_URL); 
      final String ldapUser = 
        System.getProperty(Context.SECURITY_PRINCIPAL, 
                           "cn=Directory Manager"); 
      final String ldapPasswd = 
        System.getProperty(Context.SECURITY_CREDENTIALS); 
      debug(Context.PROVIDER_URL + "=" + ldapServerUrl); 
      debug(Context.SECURITY_PRINCIPAL + "=" + ldapUser); 
      if (debug) { 
                  System.out.print(Context.SECURITY_CREDENTIALS + "="); 
                  final int len = (ldapPasswd==null)?0:ldapPasswd.length(); 
                  for (int i=0;i<len;i++) System.out.print("*"); 
                  System.out.println(); 
      } 
      env.put(Context.INITIAL_CONTEXT_FACTORY,factory); 
      env.put(Context.SECURITY_PRINCIPAL, ldapUser); 
      if (ldapServerUrl != null) 
           env.put(Context.PROVIDER_URL, ldapServerUrl); 
      if (ldapPasswd != null) 
           env.put(Context.SECURITY_CREDENTIALS, ldapPasswd); 
      InitialContext root = new InitialLdapContext(env,null); 
      return (DirContext)(root.lookup("")); 
  } 
   
[...] 
 

 ПРИМЕР КОДА 4-1 шоу начальное создание сервера MBean mbs, и получение указателя на корневой контекст дерева каталогов LDAP, в котором должен быть зарегистрирован адрес сервера соединителя. Все соответствующие переменные доступа LDAP, такие как провайдер URL, имя пользователя LDAP и учетные данные безопасности, даются здесь и передаются в карту среды env. Карта среды env тогда передается в качестве параметра в звонок InitialLdapContext, из которого получается начальный контекст LDAP.

Код, который опускается от  ПРИМЕРА КОДА 4-1, получает имя агента, под которым соединитель будет зарегистрирован в сервере LDAP.

 ПРИМЕР КОДА 4-2 Примера Службы Поиска JNDI/LDAP Server.java (Выборка 2)
[...] 
 
public static void register(DirContext root, 
                           JMXServiceURL jmxUrl, 
                           String name) 
   throws NamingException, IOException { 
 
   final String mydn = System.getProperty("dn","cn="+name); 
 
   debug("dn: " + mydn ); 
 
   Object o = null; 
   try { 
       o = root.lookup(mydn); 
   } catch (NameNotFoundException n) { 
       Attributes attrs = new BasicAttributes(); 
       Attribute objclass = new BasicAttribute("objectClass"); 
       objclass.add("top"); 
       objclass.add("javaContainer"); 
       objclass.add("jmxConnector"); 
       attrs.put(objclass); 
       attrs.put("jmxAgentName", name); 
       o = root.createSubcontext(mydn,attrs); 
   } 
   if (o == null) throw new NameNotFoundException(); 
   final Attributes attrs = root.getAttributes(mydn); 
   final Attribute oc = attrs.get("objectClass"); 
   if (!oc.contains("jmxConnector")) { 
       final String msg = "The supplied node [" + mydn +  
         "] does not contain the jmxConnector objectclass"; 
       throw new NamingException(msg); 
   } 
    
   final Attributes newattrs = new BasicAttributes(); 
   newattrs.put("jmxAgentName",name); 
   newattrs.put("jmxServiceURL",jmxUrl.toString()); 
   newattrs.put("jmxAgentHost",InetAddress.getLocalHost().getHostName()); 
   newattrs.put("jmxProtocolType",jmxUrl.getProtocol()); 
   newattrs.put("jmxExpirationDate", 
                getExpirationDate(JMX_DEFAULT_LEASE)); 
   root.modifyAttributes(mydn,DirContext.REPLACE_ATTRIBUTE,newattrs); 
} 
 
[...] 
 

 ПРИМЕР КОДА 4-2 шоу регистрация серверной службы соединителя JMX URL в каталоге LDAP. DN, где URL будет зарегистрирован, можно передать командной строке через dn Системное свойство, то есть, -Ddn=mydn (см. позже используемые команды, запускают сервер). Если dn Системное свойство не определяется, тогда можно использовать DN: cn=назовите, где имя agentName. Естественно, это не обязательно. Расположение, где URL регистрируется, действительно не имеет значения, потому что клиентский код никогда не использует это DN непосредственно, но вместо этого выполняет поиск LDAP, чтобы найти узлы, у которых есть вспомогательный глагол jmxConnector ObjectClass. Что важно, вот то, что каждый URL регистрируется в его собственном узле LDAP. То, как назвать эти узлы, оставляют администратору LDAP, который в этом случае является Вами. В этом примере предполагается, что Вы сконфигурировали свой сервер LDAP, создавая a root контекст тот, под который узел cn=имя может быть создано, и что это root контекст передали к начальному контексту LDAP через Context.PROVIDER_URL свойство (см.  ПРИМЕР КОДА 4-1).

Код, показанный в  ПРИМЕРЕ КОДА 4-2 проверки, существует ли узел, в котором Вы зарегистрируете сервер URL уже. Если это не делает, Вы пытаетесь создать это (это перестанет работать, если родительский узел не будет существовать). Начиная с jmxConnector ObjectClass простой вспомогательный class, Вы будете использовать javaContainer ObjectClass как структурный class, если Вы должны создать новый контекст. Еще раз это является абсолютно дополнительным. Любое структурное class ТО, к который jmxConnector вспомогательный class мог быть добавлен, будет приемлемым. Это тогда проверяет, имеет ли узел, в котором Вы зарегистрируете сервер уже, jmxConnector вспомогательный class. В противном случае исключение выдается.

В этой точке Вы уверены, что узел, в котором Вы зарегистрируете URL, существует, и имеет соответствующее jmxConnector вспомогательный class. Таким образом, Вы должны только заменить значения атрибутов, определенных JMX Удаленный API для поиска LDAP (см. jmx-schema.txt):

  • jmxServiceUrl: содержит String форма сервера URL, как получено из server.getAddress() после того, как сервер был запущен
  • jmxAgentName: содержит имя агента JMX
  • jmxProtocolType: содержит тип протокола JMX, как возвращено jmxUrl.getProtocolType()
  • jmxAgentHost: содержит имя узла агента
  • jmxExpirationDate: содержит дату, в которой URL будут считать устаревшим.
 ПРИМЕР КОДА 4-3 Примера Службы Поиска JNDI/LDAP Server.java (Выборка 3)
 
[...] 
 
   public JMXConnectorServer rmi(String url) 
     throws IOException, JMException, 
        NamingException, ClassNotFoundException { 
 
     JMXServiceURL jurl = new JMXServiceURL(url); 
     final HashMap env = new HashMap(); 
     // Prepare the environment Map 
     
[...] 
 
     JMXConnectorServer rmis = 
        JMXConnectorServerFactory.newJMXConnectorServer(jurl, env, mbs); 
 
     final String agentName = System.getProperty("agent.name", 
                                                 "DefaultAgent"); 
     start(rmis,env,agentName); 
     return rmis; 
   } 
     
[...] 
 

В  ПРИМЕРЕ КОДА 4-3, называют новый сервер соединителя RMI rmis создается со службой JMX URL jurl и соответствующие свойства LDAP, которые передают к его карте среды env. Сервер соединителя rmis запускается, вызывая JMXConnectorServer.start() и регистрируется в сервере LDAP.

 ПРИМЕР КОДА 4-4 Примера Службы Поиска JNDI/LDAP Server.java (Выборка 4)
 
[...] 
 
    public void start(JMXConnectorServer server, Map env, String agentName) 
       throws IOException, NamingException { 
       server.start(); 
       final DirContext root=getRootContext(); 
       final JMXServiceURL address = server.getAddress(); 
       register(root,address,agentName); 
    } 
     
[...] 
 

 ПРИМЕР КОДА 4-4 шоу создание сервера соединителя JMX server, получение указателя на корневой каталог сервера LDAP root и создание URL для server именованный address. Корневой каталог, URL и имя агента передают как параметры к register() и регистрируются в сервере LDAP.

Client.java

Служба поиска JNDI/LDAP Client.java class показывают в  ПРИМЕРЕ КОДА 4-1.

 ПРИМЕР КОДА 4-1 Пример Службы Поиска JNDI/LDAP Client.java
 
[...] 
 
public class Client { 
 
   private static boolean debug = false; 
 
   public static void listAttributes(DirContext root, String dn) 
     throws NamingException { 
     final Attributes attrs = root.getAttributes(dn); 
     System.out.println("dn: " + dn); 
     System.out.println("attributes: " + attrs); 
   } 
    
   public static DirContext getRootContext() throws NamingException { 
      final Hashtable env = new Hashtable(); 
      // Prepare environment map 
      [...] 
       
      InitialContext root = new InitialLdapContext(env,null); 
      return (DirContext)(root.lookup("")); 
   } 
    
   // Confirm URL has not expired  
  [...]  
 
   public static List lookup(DirContext root, String protocolType, 
                             String name) 
      throws IOException, NamingException { 
      final ArrayList list = new ArrayList(); 
      String queryProtocol = 
         (protocolType==null)?"":"(jmxProtocolType="+protocolType+")"; 
      String query = 
          "(&" + "(objectClass=jmxConnector) " + 
          "(jmxServiceURL=*) " + 
          queryProtocol + 
          "(jmxAgentName=" + ((name!=null)?name:"*") + "))"; 
 
      SearchControls ctrls = new SearchControls(); 
      ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      final NamingEnumeration results = root.search("", query, ctrls); 
      while (results.hasMore()) {  
           final SearchResult r = (SearchResult) results.nextElement(); 
           debug("Found node: " + r.getName()); 
           final Attributes attrs = r.getAttributes(); 
           final Attribute attr = attrs.get("jmxServiceURL"); 
           if (attr == null) continue; 
           final Attribute exp = attrs.get("jmxExpirationDate"); 
           if ((exp != null) && hasExpired((String)exp.get())) { 
               System.out.print(r.getName() + ": "); 
               System.out.println("URL expired since: " + exp.get()); 
               continue; 
           }   
           final String urlStr = (String)attr.get(); 
           if (urlStr.length() == 0) continue; 
 
    
           debug("Found URL: "+ urlStr); 
 
    
           final JMXServiceURL url = new JMXServiceURL(urlStr); 
           final JMXConnector conn = 
               JMXConnectorFactory.newJMXConnector(url,null); 
           list.add(conn); 
           if (debug) listAttributes(root,r.getName()); 
      } 
 
      return list; 
 
   }   
} 
 

В  ПРИМЕРЕ КОДА 4-1, Client во-первых возвращает указатель root к каталогу LDAP DirContext, тогда это перерывает каталог для классов объектов типа jmxConnector. Служба URL и атрибуты даты окончания срока действия, attr и exp соответственно, для jmxConnector классы объектов получаются, exp проверяется, чтобы удостовериться, что URL не истек, и вызов выполняется к JMXConnectorFactory создать новый соединитель conn. Соединитель conn добавляется к списку соединителей и используется, чтобы получить доступ к MBeans в сервере MBean, создаваемом Server.

jmx-schema.txt

jmx-schema.txt файл является файлом схемы LDAP для JMX Удаленный API.

60jmx-schema.ldif

60jmx-schema.ldif файл ldif файл, соответствующий файлу схемы LDAP, jmx-schema.txt, для технологии JMX. Если Вы используете Sun ОДИН Сервер каталогов, этот файл может быть скопирован непосредственно в config/schema каталог Sun ОДИН Сервер каталогов (см., что Раздел "Устанавливает Пример Службы Поиска JNDI/LDAP").

Выполнение Примера Службы Поиска JNDI/LDAP

В дополнение к действиям Вы выполняли в Разделе "Начальную Конфигурацию", прежде, чем можно будет выполнить примеры службы поиска, которые используют службу поиска JNDI/LDAP, следует выполнить некоторые дальнейшие начальные действия, которые являются определенными для этого примера. Можно тогда начать искать соединители, используя сетевую технологию JNDI/LDAP в соединении с этими двумя соединителями, поддерживаемыми технологией JMX.

Когда Вы выполняете примеры, чтобы помочь Вам отследить, из которых был создан агент, с которым транспортом, имена агента включают суффикс буквы, который является тем же самым как надписью соответствующего раздела. Например, агент от Раздела a. "Соединитель RMI по JRMP, без внешнего каталога." вызывается example-server-a.

Установка Примера Службы Поиска JNDI/LDAP

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

  1. Остановите сервер LDAP, Вы запустили в Разделе "Начальную Конфигурацию".

    Сделайте это согласно типу сервера LDAP, который Вы используете.

  2. Скопируйте технологическую схему JMX в свой сервер LDAP schema каталог.

    Например, если бы Вы используете Sun ОДИН Сервер каталогов 5.0, Вы ввели бы:

    $ cp 60jmx-schema.ldif/var/ds5/slapd-<имя узла>/config/schema

    Иначе, сделайте это согласно типу сервера LDAP, который Вы используете.

  3. Перезапустите сервер LDAP.

    Сделайте это согласно типу сервера LDAP, который Вы используете.

  4. Определите корень под который Server зарегистрирует его службу URL.

    Следует обеспечить Server с путем к компонентному суффиксу домена dc=Test то, что Вы создали в Разделе "Начальную Конфигурацию".

    $ провайдер = "ldap://$ldapport/dc=Test $ldaphost:"

  5. Скомпилируйте Client и Server классы.

    $ javac-d. Server.java Client.java

Выполнение Примера Службы Поиска JNDI/LDAP С Соединителем RMI

Этот пример демонстрирует использование службы поиска JNDI/LDAP, чтобы искать серверы соединителя RMI, которые используют транспорт значения по умолчанию RMI, JRMP, так же как транспорт IIOP. Кроме того, как описано в Разделе "Начальная Конфигурация", различные внешние каталоги используются, чтобы зарегистрировать тупики соединителя RMI.

Комбинации транспортов и внешних каталогов, демонстрируемых здесь:

  • Соединитель RMI по транспорту JRMP, с:
  • Никакой внешний каталог
  • Реестр RMI
  • Реестр LDAP
  • Соединитель RMI по транспорту IIOP, с:
  • Никакой внешний каталог
  • CORBA именование службы
  • Реестр LDAP
  1. Запустите Server.

    Команда Вы используете, чтобы запустить Server изменяется, согласно которому внешнему каталогу Вы используете. Можно запустить один или больше следующих экземпляров Server с различными транспортами и внешними реестрами прежде, чем запуститься Client.

    1. Соединитель RMI по JRMP, без внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath . -Ddebug=true \ 
        -Dagent.name=example-server-a \ 
        -Durl="service:jmx:rmi://" \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jndi.Server & 
       
      

      В этой команде:

      • debug устанавливается в истину обеспечить более полный экранный вывод когда Server выполнения.
      • Имя агента, который будет создан, example-server-a.
      • URL, provider, это указывает на компонентный суффикс домена, в котором будет зарегистрирован агент, дается.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.
      • URL службы определяет, что выбранный соединитель является соединителем RMI, работая на основе транспорта значения по умолчанию RMI JRMP.

      Когда Сервер будет запущен, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска JNDI/LDAP.

    2. Соединитель RMI по JRMP, используя реестр RMI в качестве внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath . -Ddebug=true \ 
        -Dagent.name=example-server-b \ 
        -Durl="service:jmx:rmi:///jndi/${jndirmi}/server" \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jndi.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-b.
      • URL, provider, это указывает на компонентный суффикс домена, в котором будет зарегистрирован агент, дается.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.
      • Служба URL определяет выбранный соединитель как RMI по JRMP, и внешний каталог в который тупик соединителя RMI, server, сохранен реестр RMI, который Вы идентифицировали как jndirmi в Разделе "Начальная Конфигурация".

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска JNDI/LDAP.

    3. Соединитель RMI по JRMP, используя LDAP в качестве внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath . -Ddebug=true \ 
        -Dagent.name=example-server-c \ 
        -Durl="service:jmx:rmi:///jndi/${jndildap}/cn=x,dc=Test" \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jndi.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-c.
      • URL, provider, это указывает на компонентный суффикс домена, в котором будет зарегистрирован агент, дается.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.
      • Служба URL определяет выбранный соединитель как RMI по JRMP, и внешний каталог, в котором сохранен тупик соединителя RMI, является сервером LDAP, который Вы идентифицировали как jndildap в Разделе "Начальная Конфигурация".

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска JNDI/LDAP под именем агента example-server-c.

    4. Соединитель RMI по IIOP, без внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath . -Ddebug=true \ 
        -Dagent.name=example-server-d \ 
        -Durl="service:jmx:iiop://" \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jndi.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-d.
      • URL, provider, это указывает на компонентный суффикс домена, в котором будет зарегистрирован агент, дается.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.
      • URL службы определяет, что выбранный соединитель является соединителем RMI, работая на основе IIOP.

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его автоматически сгенерированного URL в службе поиска JNDI/LDAP.

    5. Соединитель RMI по IIOP, используя CORBA, называющий как внешний каталог.

      Запустить Server вводя следующую команду:

       
      $ java -classpath . -Ddebug=true \ 
        -Dagent.name=example-server-e \ 
        -Durl="service:jmx:iiop:///jndi/${jndiiiop}/server" \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jndi.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-e.
      • URL, provider, это указывает на компонентный суффикс домена, в котором будет зарегистрирован агент, дается.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.
      • Служба URL определяет выбранный соединитель как соединитель RMI по IIOP, и внешний каталог, в котором сохранен тупик соединителя RMI, сервер, является CORBA именование службы, которую Вы идентифицировали как jndiiiop в Разделе "Начальная Конфигурация".

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска JNDI/LDAP под именем example-server-e.

    6. Соединитель RMI по IIOP, используя LDAP в качестве внешнего каталога.

      Запустить Server вводя следующую команду:

       
      $ java -classpath . -Ddebug=true \ 
        -Dagent.name=example-server-f \ 
        -Durl="service:jmx:iiop:///jndi/${jndildap}/cn=x,dc=Test" \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jndi.Server & 
       
      

      В этой команде:

      • Имя создаваемого агента example-server-f.
      • URL, provider, это указывает на компонентный суффикс домена, в котором будет зарегистрирован агент, дается.
      • Атрибут общего названия principal и пароль credentials даются, чтобы получить доступ к серверу LDAP.
      • Служба URL определяет выбранный соединитель как RMI по IIOP, и внешний каталог, в котором сохранен тупик соединителя RMI, является сервером LDAP, который Вы идентифицировали как jndildap в Разделе "Начальная Конфигурация".

      Когда Server запускается, Вы будете видеть подтверждение создания соединителя RMI, и регистрацию его URL в службе поиска JNDI/LDAP под именем агента example-server-f.

    • Запустите Client.
    • После запуска Server используя транспортный и внешний каталог Вашего выбора, запустите Client:

       
      $ java -classpath . -Ddebug=true \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        jndi.Client 
       
      

      Вы будете видеть, что вывод подтверждает обнаружение агентов, создаваемых Server и зарегистрированный в службе поиска. Вы будете также видеть идентификацию и подтверждение соединения, сделанного к агентам.

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

       
      $ java -classpath . -Ddebug=true \ 
        -Djava.naming.provider.url="$provider" \ 
        -Djava.naming.security.principal="$principal" \ 
        -Djava.naming.security.credentials="$credentials" \ 
        -Dagent.name=agentName \ 
        jndi.Client 
       
      

      В команде, показанной выше, agentName является именем агента, который Вы хотите искать. Можно также определить частичное имя агента при использовании *; например, x* для всех имен агента, начинающихся с буквы x.


Содержание | Предыдущий | Следующий


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