Сервер RMI останавливается?
Как мне сохранить работоспособность сервера RMI? Он в данный момент просто связывает и возражает, затем выходит..
public class WutServer {
public static void main(String[] args) throws RemoteException {
Registry registry = LocateRegistry.createRegistry(1099);
try {
registry.bind("WutManager", new WutManager());
System.out.println("Ready..");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Я просто управляю этим классом. Я не бегал RMS или что-нибудь..
Как заставить его продолжать работать?
5 ответов
Попробуй это:
Remote stub = UnicastRemoteObject.exportObject(new WutManager(), 0);
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("WutManager", stub);
Примечание: WutManager должен реализовывать java.rmi.Remote.
Ваш сервер DGC'd, а затем GC'd, что приводит к тому, что он не экспортируется, что в конечном итоге приводит к выходу JVM, если ему больше нечего делать. Чтобы остановить это, если вы создаете реестр через LocateRegistry.createRegistry()
, сохраните возвращаемое значение этого метода в статической переменной. В противном случае сохраните статическую ссылку на ваш объект сервера.
Это старый вопрос, но вот новый ответ.
На OSX, используя последнюю версию Java 9.0.4, я обнаружил, что программа завершается. Если я использую последнюю версию Java 1.8.0.162, то она не завершается и сервер продолжает работать.
Создайте объект и дождитесь вызова объекта в конце основной функции. То есть;
public static void main(String[] args) throws RemoteException {
Registry registry = LocateRegistry.createRegistry(1099);
//your object to wait
Object lockObject=new Object();
try {
registry.bind("WutManager", new WutManager());
System.out.println("Ready..");
//here makes your rmi server non-stop
synchronized(lockObject){
lockObject.wait();
}
}catch (Exception e) {
e.printStackTrace();
}
}
Вам нужно сделать WutServer
реализовать интерфейс, через который клиенты будут получать к нему доступ, который, в свою очередь, должен наследоваться от интерфейса маркера Remote
, Вы также, вероятно, хотите сделать WutServer
класс наследуется от UnicastRemoteObject
; в то время как есть другие способы создания поддержки удаленного взаимодействия, наследуя от UnicastRemoteObject
это определенно самый простой способ получить что-то.
Попробуйте это вместо этого (хотя вам, вероятно, следует разделить удаленный интерфейс на другой файл и раздать его отдельно):
public class WutServer extends UnicastRemoteObject implements WutServer.Wut {
interface Wut extends Remote {
String wut() throws RemoteException;
}
// Because of the exception...
public WutServer() throws RemoteException {}
public String wut() { return "wut"; }
public static void main(String[] args) throws RemoteException {
LocateRegistry.createRegistry(1099).rebind("WutManager",new WutServer());
System.out.println("Ready...");
}
}