Verhogen
Verhogen

Reputation: 28631

RMI Server Stops?

How do I keep an RMI server running? It currently, just binds and object, then exits..

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();
    }
  }
}

I am simply running this class. I didn't run rmic or anything..

How do I force it to stay running?

Upvotes: 1

Views: 2762

Answers (5)

skaak
skaak

Reputation: 3018

This is an old question, but here is a new answer.

On OSX, using latest Java 9.0.4 I find that the program exits. If I use latest Java 1.8.0.162 then it does not exit and the server remains running.

Upvotes: 0

user207421
user207421

Reputation: 310985

Your server is being DGC'd and then GC'd, which causes it to be unexported, which eventually causes the JVM to exit if it has nothing else to do. To stop that, if you are creating the Registry via LocateRegistry.createRegistry(), keep the return value of that method in a static variable. Otherwise keep a static reference to your server object.

Upvotes: 1

mdikici
mdikici

Reputation: 1504

Create an object and call wait of the object at the end of the main function. That is;

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();          
     } 
}

Upvotes: -1

Donal Fellows
Donal Fellows

Reputation: 137697

You need to make WutServer implement the interface that clients will access it by, which in turn should inherit from the marker interface Remote. You also probably want to make the WutServer class inherit from UnicastRemoteObject; while there are other ways to build the remoting support, inheriting from UnicastRemoteObject is definitely the easiest way to get something going.

Try this instead (though you should probably separate the remote interface into another file and have it be redistributed separately):

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...");
    }
}

Upvotes: -1

Adriaan Koster
Adriaan Koster

Reputation: 16209

Try this:

Remote stub = UnicastRemoteObject.exportObject(new WutManager(), 0);
Registry registry = LocateRegistry.createRegistry(1099);
registry.rebind("WutManager", stub);

Note: WutManager should implement java.rmi.Remote.

Upvotes: 2

Related Questions