Попытка подключиться к службе CORBA с помощью URL-адреса corbaloc - PullRequest
3 голосов
/ 10 мая 2010
    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();

Этот узкий просто висит.

Мой сервис настроен для работы на статическом порту. И мы знаем, что это работает, так как мы обычно ищем это через NamingService.

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 26 мая 2010

Если вы используете NamingService, вы должны использовать URL-адрес corbaname вместо URL-адреса corbaloc. Приведенное ниже будет работать, если ваша служба именования находится на порту 6969. Если «OurServiceHelper» находится на 6969, но служба NamingService находится на другом порту, вам нужно указать порт службы имен в приведенной ниже ссылке вместо 6969. объект сервера встроен в ior, возвращенный NamingService, поэтому его указывать не нужно.

"corbaname:10.1.1.200:6969#OurServiceHelper"

Re: Комментарий: Сначала записка о IOR и обслуживании объектов. Если вы хотите, чтобы ваши обслуживаемые объекты были постоянными при перезапуске процесса, вы должны установить политику времени жизни PERSISTENT в POA, который содержит объекты. Кроме того, IOR встраивает ip и порт сервера, поэтому, если вы хотите генерировать IOR, которые остаются согласованными при перезапусках, вы должны использовать статический IP-адрес и номер порта, а также политику постоянного времени жизни.

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

Если вы решили не использовать службу имен, ваш код должен будет несколько измениться. Если вы используете corbaloc url, то вы используете Interoperable Naming Service (INS). См .: http://java.sun.com/j2se/1.4.2/docs/guide/idl/INStutorial.html. Используя INS, вам необходимо использовать функциональность объекта NamingContextExt. В частности, чтобы разрешить созданный вами URL-адрес corabloc, вы должны вызвать функцию NamingContextExt::resolve_str и передать URL-адрес.

0 голосов
/ 20 июня 2010

В corbaloc нет информации о типе, поэтому ORB проверяет тип, к которому вы сужаете, посредством удаленного вызова (_is_a). Попробуйте использовать узкую галочку, которая не будет вызывать _is_a:

_OurServiceHelper cpsh = _OurServiceHelperHelper.narrow(cobj);

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

0 голосов
/ 03 июня 2010

Ключевая часть URL-адреса corbaloc (строка после косой черты), возможно, неверна или не зарегистрирована должным образом, и серверная сфера не может сопоставить ключ со ссылкой на объект.

Как у вас работает сервер?

Это должно работать:

<server> -ORBInitRef OurServiceHelper="file://server.ior"

Таким образом, когда запрос corbaloc поступит в сферу, он сможет сопоставить ключ с ior и вернуть вам ior. Различные ORB имеют разные способы сделать это для регистрации начальной ссылки, например, TAO имеет собственный интерфейс IORTable.

...