Java RMI InitialContext: эквивалент LocateRegistry.createRegistry (int)? - PullRequest
1 голос
/ 10 марта 2010

Я пытаюсь использовать довольно простые RMI:

//   Context namingContext = new InitialContext();
         Registry reg = LocateRegistry.createRegistry(9999);
         for ( int i = 0; i < objs.length; i++ ) {
            int id = objs[i].getID();
//            namingContext.bind( "rmi:CustomObj" + id , objs[i] );
            reg.bind( "CustomObj" + id , objs[i] );
         }

Это работает без проблем, но для будущих целей мне нужно использовать InitialContext.

         Context namingContext = new InitialContext();
         for ( int i = 0; i < objs.length; i++ ) {
            int id = objs[i].getID();
             namingContext.bind( "rmi:CustomObj" + id , objs[i] );
         }

Но я не могу заставить это работать. Я запустил rmiregistry из командной строки. Есть ли эквивалент LocateRegistry.createRegistry(int)? Или каким-то другим способом запустить реестр RMI / реестр, используемый InitialContext, из моего класса? (Вместо командной строки)


Трассировка стека:

javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student]
        at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:126)
        at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:208)
        at javax.naming.InitialContext.bind(InitialContext.java:400)
        at bguiz.scratch.RMITest.main(RMITest.java:29)
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: bguiz.scratch.CustomObj
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
        ....(truncated)

РЕДАКТИРОВАТЬ: я удалю свой вопрос через пару дней, так как, кажется, нет ответа на этот вопрос (я не смог сам разобраться) Последний звонок для любых битеров!

Ответы [ 3 ]

1 голос
/ 26 марта 2010

После долгих кований я решил проблему. К вашему сведению, вот что это было:

ClassNotFoundException сбрасывается, потому что реестр RMI имеет свой собственный путь к классу. Неважно, что класс, содержащий InitialContext, имеет пользовательские объекты в своем пути к классам - реестр RMI должен быть инициализирован таким образом, чтобы пользовательские объекты также находились в его пути к классам .

Для этого установите значение окружения classpath в командной строке перед началом rmiregistry. Если этот classpath содержит класс пользовательского объекта, ClassNotFoundException не генерируется, и впоследствии исключаются ServerException и CommunicationException.

0 голосов
/ 10 марта 2010
java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student caused by
java.lang.ClassNotFoundException: bguiz.scratch.CustomObj

Проверить, доступен ли этот класс?

0 голосов
/ 10 марта 2010

Есть ли эквивалент LocateRegistry.createRegistry(int)?

номер

Или каким-то другим способом запустить реестр / реестр RMI, используемый InitialContext, из моего класса?

Только LocateRegistry.createRegistry().

Я почти уверен, что вам нужно указать имя хоста в URL. Какое исключение и сообщение об ошибке вы получаете?

...