# RMI Server beendet sich selbst



## &gt;wintermute&lt; (21. Apr 2008)

Hi!
Ich habe eine kleine RMI-Anwendung erstellt und folgendes Problem:
Die Server-Applikation beendet sich nach der Registrierung oft sofort und kann daher keine Client-Anfragen entgegennehmen. Dies ist aber nicht immer der Fall, sondern nur manchmal.
Ist dieses Problem vielleicht jemandem bekannt?
Oder hab ich doch etwas im Code falsch gemacht?

```
private static Registry registry = null;
	
public static void main(String[] args) {
	try {	
		ObjectImplement com = new ObjectImplement();
		ObjectInterface stub = (ObjectInterface)UnicastRemoteObject.exportObject( com, 0 ); 
		RemoteServer.setLog( System.out );
			
		registry = LocateRegistry.createRegistry(2019);
		registry.rebind("MeinServerObjekt", stub);
			
	} catch (RemoteException e) {
		System.err.println(e.getLocalizedMessage());
	} catch(Exception e) {
		System.err.println(e.getLocalizedMessage());
	}
}
```

Danke, wintermute


----------



## itstata (22. Apr 2008)

Hallo,
ich bin selber noch anfänger in rmi, ich weiss auch nicht, was hier noch passiert->

ObjectImplement com = new ObjectImplement(); 
      ObjectInterface stub = (ObjectInterface)UnicastRemoteObject.exportObject( com, 0 ); 
      RemoteServer.setLog( System.out );

beendet sich der Server wenn du drauf zugreifst oder einfach nur so?
falls einfach nur so, ist das sehr eigenartig . bei einem absturz mitten im zugriff, könnte dann der fehler durch den methodenaufruf vom client kommen



mit diesem code würde es allerdings bei mir gehen:

Hauptklasse

```
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class test {

	private static Registry registry = null; 
    
	public static void main(String[] args) throws RemoteException, AlreadyBoundException { 
		System.out.println("Starte Registrierung");
		Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);

		MeineKlasse remote = new MeineKlasseImpl();
		System.out.println("OK");
		registry.bind("Abruf", remote);
		System.out.println("Server gestartet ...");
	}

}
```


Interface

```
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface MeineKlasse extends Remote {

	String sagHallo() throws RemoteException;
}
```


```
import java.rmi.*;
import java.rmi.registry.Registry;
import java.rmi.server.*;

public class MeineKlasseImpl extends UnicastRemoteObject implements MeineKlasse {

	protected MeineKlasseImpl() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}

	private static final long serialVersionUID = 33009593583244040L;

	public String sagHallo() {
		return "hallo";
	}
}
```

ich hoffe, das hilft dir


----------



## &gt;wintermute&lt; (22. Apr 2008)

Hi, danke für die Antwort.



			
				itstata hat gesagt.:
			
		

> ich bin selber noch anfänger in rmi, ich weiss auch nicht, was hier noch passiert->
> 
> ObjectImplement com = new ObjectImplement();
> ObjectInterface stub = (ObjectInterface)UnicastRemoteObject.exportObject( com, 0 );
> ...



Die drei Zeilen stehen 
(1) für ein RemoteObjekt
(2) für die Anmeldung des Interfaces des Objekts (wie du es auch beschrieben hast) beim RMI-Server
(3) für die Umlenkung des RMI-Outputs auf die Kommandozeile (könnte man auch weglassen...)

Der Server beendet sich sofort nach der Ausführung, lange bevor ein Client die Chance hat, darauf zuzugreifen, ABER: wie gesagt, lang nicht immer, sondern nur manchmal.... Wenn er einmal rennt, dann passt alles. Aber es sollte immer funktionieren....

MFG, wintermute


----------



## itstata (22. Apr 2008)

hört sich irgendwie so an, als wenn das nicht unbedingt an rmi liegt. wenn du sagst, dass er durchlaufen kann. es wird ja eigenltich der gleiche code ausgeführt. vielleicht ne dumme idee, aber hast du firewall oder sowas an?


----------



## &gt;wintermute&lt; (28. Apr 2008)

Also Firewall oder so rennt keine.
Das Ganze passiert, wenn ich den laufenden Server beende und dann wieder starten will. Vielleicht beendet sich da irgendetwas nicht richtig? Muss man bei der RMI-Registry irgendetwas ABmelden (wäre mir neu...) ?
Danke...


----------



## Niki (28. Apr 2008)

Du kannst einen workaround einbauen, in dem du einfach eine Schleife bastelst und das Programm so am laufen hältst:

```
public class MyRMIServer{
  private static boolean _continue = true;

  public static void main(String[] args){
    //hier Remote Objekt registrieren...
    //hier Schleife einbauen
    while(_continue){
      try{
        synchronized(MyRMIServer.class){
          MyRMIServer.class.wait(10000);
          System.gc();
        }
      }catch(InterruptedException ex){

      }
    }
  }

  public static synchronized void stop(){
    _continue = false;
    MyRMIServer.class.notify();
  }
}
```


----------



## Guest (28. Apr 2008)

Versuche mal das hier
	
	
	
	





```
public static void main(String[] args) { 
   try {    
      ObjectImplement com = new ObjectImplement(); 
      RemoteServer.setLog( System.out ); 
      registry = LocateRegistry.createRegistry(2019); 
      registry.rebind("MeinServerObjekt", com); 
   } catch (RemoteException e) { 
      System.err.println(e.getLocalizedMessage()); 
   } catch(Exception e) { 
      System.err.println(e.getLocalizedMessage()); 
   } 
}
```
Ich gehe davon aus, dass ObjectImplement Remote und UnicastRemoteObject implementiert.


----------

