2016-09-19 1 views
0

У меня есть сервер RMI, который публикует объект следующим образом:Restart Java RMI реестра на той же или другой порт на Windows, только после того, как тайм-аут

int port = ....; 
String name = "..."; 
Remote server = UnicastRemoteObject.exportObject(someobject, port+1); 
Registry registry = LocateRegistry.createRegistry(port); 
registry.rebind(name, server); 
log.info("created service name "+name+", on port "+(port+1) 
     +" in registry on port "+port); 

Когда я остановить программу и просто запустите его, он регистрирует, что оно создал все, но затем сразу же выходит, вероятно, из-за выхода сервера rmi (последнего не-демона). Я зарегистрировал defaultUncaughtExceptionHandler, но ничего не получил от него. Только через минуту или около того я могу перезапустить программу без ее немедленного выхода.

Если бы я всегда использовал один и тот же порт, это бы меня только наполовину удивил, потому что я знаю, что порты могут быть заблокированы через некоторое время после их последнего использования. Но поведение такое же, даже если я использую другой порт (+100 или около того) каждый раз.

Любые идеи, почему это происходит и как можно предотвратить это?

ответ

1

Вам необходимо сохранить результат createRegistry() в статическую переменную. В противном случае он может быть собран в мусор.

+0

Как только вы это знаете, это логично, но мне кажется странным, что выключение сервера зависит от того, идет ли GC или нет. Думаю, должно быть наследие Java 1.1. – Harald

+0

Ничего общего с «наследием Java 1.1». Объект получает garbage-gather => он перестает быть, будь то POJO, экспортированный удаленный объект, RMI Registry, ... – EJP

+0

Я имею в виду, что неявное завершение работы сервера GC выглядит как идея из Java 1.1 раз , Но это, возможно, не было преднамеренным. Сегодня я бы подумал, что можно было бы предоставить явный метод shutdown, который сам по себе уже побуждает пользователя объекта сервера сохранять ссылку. – Harald

Смежные вопросы