Доступ к Java Corba NameService

Есть ли способ получить доступ к службе имен corba из работающей программы Java (1.5). Я хотел бы видеть, какие другие процессы зарегистрированы для данного.

Я знаю, что в JRE есть три инструмента. servertool, orbd а также tnameserv но либо я не использовал их должным образом, либо они не являются подходящими инструментами.

Дополнительная информация: Программа запускается с -ORBInitialPort 1234

казнить orbd -ORBInitialPort 1234 -> Возвращает ошибку из-за того, что уже используется (да, хорошо, потому что приложение работает), то же самое с tnameserv, Но если я использую servertool -ORBInitialPort 1234ошибок не возникает. Но если я наберу "list" в командной строке или другой команде, он всегда вернет пустой список.

Искренне христианский

2 ответа

Решение

К существующей работающей службе именования CORBA можно получить доступ через классы в пакете org.omg.CosNaming. Вам необходимо получить NamingContextExt, У него есть методы для перебора всех существующих привязок, а также для разрешения объектов по имени.

Когда вы начинаете tnameserv инструмент, он печатает для вас IOR - это URL-адрес CORBA. Вы можете получить объект CORBA (включая службу имен) из любого ORB в мире, если он доступен через сеть и вы предоставляете IOR:

public static void main(String args[]) throws Exception {
   ORB orb = ORB.init(args, null);
   // pass the IOR as command line parameter for this program
   String ior = args[0];
   org.omg.CORBA.Object objRef = orb.string_to_object(ior);
   NamingContextExt nameService = NamingContextExtHelper.narrow(objRef);

   // Now you can work with your naming service. 
}

Смотрите здесь учебник о том, как получить доступ к объектам CORBA, и здесь о том, как работать со службой именования.

orb.resolve_initial_references("NameService") по умолчанию (если не настроено) возвращает локальную службу на работающей виртуальной машине, и вам нужно запросить внешнюю. Чтобы использовать это, вам нужно передать правильные свойства конфигурации (второй параметр, который является нулевым в моем примере) со свойством ORBInitRef.NameService, установленным в адрес вашей службы имен, как описано здесь. Во многих (или в большинстве) производственных средах это свойство установлено так, что этот метод возвращает правильную службу удаленных имен.

servertool - это инструмент командной строки, который позволяет выводить список зарегистрированных объектов CORBA без написания кода Java. Необходимо указать, на каком хосте запущена интересующая служба имен. servertool не будет жаловаться, если служба работает на заданном хосте и порте. Стоит пожаловаться, если не найдет!

Самое главное, ваш объект CORBA должен зарегистрироваться в полученной службе имен, вызвав

nameService.bind(yourName, yourCORBAObject);

В случае, если служба имен удалена, будет отправлено сетевое сообщение, содержащее URL вашего шара и ссылку на ваш объект. Если вы не регистрируете свой объект, конечно, ссылка там будет недоступна, и servertool покажет вам пустой список, как вы и жалуетесь.

Вам нужно позвонитьrebindметод. Вот пример

Первый, кто побежитorbdзапустить службу именования

      orbd -port 8888
      /** Run with prgoram param:
java Server -ORBInitialPort 8888 -ORBInitialHost localhost
 */
public class Server {

    public static void main(String args[]) {
        try{
            // create and initialize the ORB
            ORB orb = ORB.init(args, null);

            // get reference to rootpoa & activate the POAManager
            POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
            rootpoa.the_POAManager().activate();

            // create servant
            EchoServer server = new EchoServer();

            // get object reference from the servant
            org.omg.CORBA.Object ref = rootpoa.servant_to_reference(server);
            Echo href = EchoHelper.narrow(ref);

            org.omg.CORBA.Object objRef =  orb.resolve_initial_references("NameService");
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);

            NameComponent path[] = ncRef.to_name( "ECHO-SERVER" );
            ncRef.rebind(path, href);

            System.out.println("Server ready and waiting ...");

            // wait for invocations from clients
            orb.run();
        }

        catch (Exception e) {
            System.err.println("ERROR: " + e);
            e.printStackTrace(System.out);
        }

        System.out.println("Exiting ...");

    }
}

Сторона клиента

      /** Run with prgoram param:
java Client -ORBInitialPort 8888 -ORBInitialHost localhost
 */
public class Client {

    public static void main(String args[]) {
        try {
            // create and initialize the ORB
            ORB orb = ORB.init(args, null);
            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
            Echo href = EchoHelper.narrow(ncRef.resolve_str("ECHO-SERVER"));

            String hello = href.echoString();
            System.out.println(hello);
        } catch (InvalidName invalidName) {
            invalidName.printStackTrace();
        } catch (CannotProceed cannotProceed) {
            cannotProceed.printStackTrace();
        } catch (org.omg.CosNaming.NamingContextPackage.InvalidName invalidName) {
            invalidName.printStackTrace();
        } catch (NotFound notFound) {
            notFound.printStackTrace();
        }

    }

}
      
Другие вопросы по тегам