Попытка подключиться к службе CORBA с использованием URL Corbaloc
Вопрос
String[] orbargs= {};
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(orbargs, null);
org.omg.CORBA.Object cobj = orb.string_to_object("corbaloc:iiop:10.1.1.200:6969/OurServiceHelper");
_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj); // Get's stuck
cpsh.ourMethod();
Этот узкий просто висит.
Мой сервис установлен для запуска на статический порт. И мы знаем, что это работает с тех пор, как мы обычно смотрим на него по именованию.
Что я делаю неправильно?
Решение
Если вы используете имя amingservice, вы должны использовать URL CORBANAME вместо URL-адреса CORBALOC. Ниже придется работать, если ваша служба именования находится на порту 6969. Если «OurserviceHelper» находится на 6969, но имя IMINGSERVICE находится в другом порту, вам необходимо указать порт именомочных услуг в URL ниже вместо 6969. Объект сервера встроен в IOR, возвращаемый имени Услуги, так вот почему его не нужно указывать.
"corbaname:10.1.1.200:6969#OurServiceHelper"
Re: Комментарий:Сначала записка о IORS и обслуживании объектов. Если вы хотите, чтобы ваши обслуживаемые объекты были настойчивыми к процессу перезапускается, вы должны установить PERSISTENT
Пожизненная политика на POA, которая содержит объекты. Кроме того, IOR встраивает IR и порт сервера, поэтому, если вы хотите создать IOR, которые остаются в соответствии с перезапусками, вы должны использовать статический IP и номер порта, а также с использованием постоянной политики жизни.
Название Service облегчает вещи, позволяя вам не нужно беспокоиться о многих этого материала. До тех пор, пока сервис имени достижится в известном месте, все ваши серверные объекты могут просто зарегистрироваться с помощью имени службы, когда они созданы, и клиенты могут получить доступ к ним без необходимости знать, где они расположены.
Если вы решите не использовать сервис имени, который вы код придется несколько изменить. Если вы используете corbaloc
URL-адрес, то вы используете совместимое обслуживание именования (Ins). Видеть: http://java.sun.com/j2se/1.4.2/docs/guide/idl/instutorial.html.html.. Отказ Использование INS, вам нужно использовать функциональные возможности NamingContextExt
объект. В частности, чтобы разрешить URL-адрес Corabloc, который вы построите, вы должны позвонить в NamingContextExt::resolve_str
функция и пройти в URL.
Другие советы
Ключевая часть URL-адреса CORBALOC (string после Slash), может быть, возможно, неверно или не зарегистрирована правильно, и серверида ORB не может сопоставить ключ к ссылке на объект.
Как вы запускаете сервер?
Это должно работать:
<server> -ORBInitRef OurServiceHelper="file://server.ior"
Таким образом, когда запрос CORBALOC поступает в ORB, должен иметь возможность сопоставить ключ к IOR и вернуть вас IOR. Различные ORB имеют разные способы выполнения этого для регистрации первоначального эталона, Tao имеет интерфейс при изменении измерений, называемый IORTABLE.
CORBALOC не имеет информации в этом, поэтому ORB проверяет тип, который вы сути, делая удаленный вызов (_is_a). Попробуйте использовать неконкуренные узкие, которые не будут звонить _is_a:
_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj);
Странно, что вызов _is_a не возвращается для вас. Я предполагаю, что unchenceed_narrow будет работать работать (вы получите ненутренний результат), но ссылка на объект не будет работать.