2016-05-24 6 views
0

есть проблема с моим RMI тест ...Java RMI - NoSuchObjectException: нет такого объекта в таблице

Сервер:

LocateRegistry.createRegistry(non-default-port); 
obj = new HelloImpl(); 
Naming.rebind("//ip-of-server/HelloServer", obj); 

Клиент:

RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory()); 

obj = (Hello) LocateRegistry.getRegistry("ip of server", non-default-port).lookup("HelloServer"); 

obj.sayHello("test"); 
(только через HTTP прокси-сервер!)

Все объекты являются статическими в классе.

Но я получаю «java.rmi.NoSuchObjectException: нет такого объекта в таблице» -Exception все время .. Это происходит только тогда, если я использовать HTTP-туннелирование через

RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory()); 

Если я попробовать его без HTTP Tunneling (с другого компьютера в обычном веб-сайте), он отлично работает!

В чем может быть проблема?

ответ

0

Вы получите это от sayHello(), а не lookup(). Смысл исключения заключается в том, что заглушка является «устаревшей», т. Е. Удаленный объект был неэкспортирован, что, вероятно, означает, что он также был DGC'd. Вы должны попробовать следующее, в таком порядке, по одному за раз:

  1. Держите статическую ссылку на значение, возвращенное createRegistry().

    Этого должно быть достаточно сам по себе, но если это не так:

  2. Держите статическую ссылку на самом удаленный объект, и нет, я не имею в виду его корешка. В этом случае obj.

Я не могу объяснить, почему это происходит только через HTTP туннелирования, но вы должны сделать (1) во всех случаях, в любом случае, так что на самом деле это ошибка ждет, чтобы случиться через любые средства.

+0

благодарит за ваш ответ! Объявлено как уже статичным в моем клиенте: static Registry reg; \t Статический Hello obj; но это не сработало. – naja08

+0

'createRegistry()' вызывается сервером, а не клиентом. Я имею в виду сервер. – EJP

+0

Пробовал это тоже .. все еще не работает:/ – naja08