Доступ к 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();
}
}
}