У меня есть сервер 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 или около того) каждый раз.
Любые идеи, почему это происходит и как можно предотвратить это?
Как только вы это знаете, это логично, но мне кажется странным, что выключение сервера зависит от того, идет ли GC или нет. Думаю, должно быть наследие Java 1.1. – Harald
Ничего общего с «наследием Java 1.1». Объект получает garbage-gather => он перестает быть, будь то POJO, экспортированный удаленный объект, RMI Registry, ... – EJP
Я имею в виду, что неявное завершение работы сервера GC выглядит как идея из Java 1.1 раз , Но это, возможно, не было преднамеренным. Сегодня я бы подумал, что можно было бы предоставить явный метод shutdown, который сам по себе уже побуждает пользователя объекта сервера сохранять ссылку. – Harald