# RMI, ContextListener und Exceptions



## miggel13 (2. Sep 2010)

Hallo, 
ich hoffe zunächst mal das mit meiner Frage hier richtig bin. Ich möcht mich schon zuvor entschuldigen, dass dieser Post lange Loggings enthält, ist aber alles nicht so schlimm wie es im ersten Blick aussieht, also bitte weiterlesen ;-)

Es geht um eine Webanwendung (Tomcat + Servlets), die nun zusätzlich als RMI-Provider dienen soll. Dabei möchte ich gerne RMI in der contextInitialized-Methode starten. 


```
//RMI-Initialisierung
        try {
            try {
                LocateRegistry.createRegistry( Registry.REGISTRY_PORT );
            } catch (Exception e) {
            }
            
//stub und registriy sind Instanzvariablen, damit ich diese auch im contextDestroyed verwenden kann
            gtdremoteimpl remote = new gtdremoteimpl();
            stub = ( gtdremote ) UnicastRemoteObject.exportObject( remote, 0 );
//Logging-Funktionalität
            RemoteServer.setLog( System.out );

            registry = LocateRegistry.getRegistry();
            try {
//hatte zuvor das Problem, dass teilweise schon der "bind" vorhanden war ... (weiß nicht genau ob das korrekt ist...)
                System.out.println("Bind");
                registry.bind("gtdcloud", stub);
                System.out.println("Binded");
            } catch (Exception e) {
                System.out.println("REBIND");
                registry.rebind( "gtdcloud", stub);
                System.out.println("REBOUNDED");
            }
            

            System.out.println("RMI erfolgreich gestartet!");
//hier lese ich nochmals die registry aus
            for(String s : registry.list()){ System.out.println("Services: "+s);};

        } catch (Exception e) {
            System.out.println("Achtung, ein Fehler trat auf!");
            e.printStackTrace();
        }


        } catch (Exception e) {
        }
```

Meine ContextDestroy-Methode sieht so aus: 
- verwende UnicastRemoteObject, damit die Objekte wieder sauber entfernt werden, jedoch funktioniert dies nicht so (siehe späteres Logging)

```
public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Shutdown");
        try {
            System.out.println("Fahre herutner");


            System.out.println("Unexport Objects");
            UnicastRemoteObject.unexportObject(stub, true);
            UnicastRemoteObject.unexportObject(registry, true);


            for(String s : registry.list()){ System.out.println("Services: "+s);};
        } catch (Exception ex) {
            System.out.println("Fehler beim Unbound");
            ex.printStackTrace();
            //Logger.getLogger(ServerInitializeListener.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
```

Es sieht auch anfangs so aus, als würde dies alles so ungefähr funktionieren. Wenn ich meine Webanwendung starte (nutze NetBeans mit Tomcat) erhalte ich folgendes Logging (beim ersten Start, nachdem nichts initialisiert ist)

- hier funktioniert das Ganze mit registry.bind
- die letzte Zeile beinhaltet die in der registry registrierten Objekte (for-Schleife) -> wäre auch OK


```
INFO: Starting Servlet Engine: Apache Tomcat/6.0.20
Bind
02.09.2010 09:05:46 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void bind(java.lang.String, java.rmi.Remote)]
02.09.2010 09:05:46 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(2)-127.0.0.1: [127.0.0.1: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
Binded
RMI erfolgreich gestartet!
02.09.2010 09:05:46 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.lang.String list()[]]
Services: gtdcloud
```

Komisch ist, dass nun Tomcat weiter läuft (siehe auch Logging-Zeitstempel) und die Webanwendung sofort wieder beendet !?

Allgemeine Startup-Infos: 


```
02.09.2010 09:05:47 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8084
02.09.2010 09:05:47 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
02.09.2010 09:05:47 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/35  config=null
02.09.2010 09:05:47 org.apache.catalina.startup.Catalina start
INFO: Server startup in 1207 ms
```

Und nun gehts wieder mit dem Shutdown weiter (siehe den Zeitstempel weiter unten)

- komisch ist ebenfalls, dass mein UnicastRemoteObject.unexportObject nicht funktioniert, obwohl das "stub"-Objekt registriert sein müsste -> NoSuchObjectException 



```
Shutdown
Fahre herutner
Unexport Objects
Fehler beim Unbound
java.rmi.NoSuchObjectException: object not exported
        at sun.rmi.transport.ObjectTable.unexportObject(ObjectTable.java:153)
        at java.rmi.server.UnicastRemoteObject.unexportObject(UnicastRemoteObject.java:297)
        at servlet.general.ServerInitializeListener.contextDestroyed(ServerInitializeListener.java:123)
        at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:3973)
        at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4577)
        at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3184)
        at org.apache.catalina.manager.ManagerServlet.reload(ManagerServlet.java:918)
        at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:360)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:196)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Thread.java:636)
02.09.2010 09:05:47 org.apache.catalina.core.StandardContext reload
INFO: Reloading this Context has started
Bind
```

- Nun möchte anscheinend Tomcat einen reload durchführen und lädt wieder contextInitialized ... 
- versucht wieder das Objekt an der registry anzumelden (bind -> siehe noch Listing oben)

- diesmal schlägt der bind fehl!!! (vorher konnte ich mit unexportObject das Objekt nicht entfernen, diesmal schlägt bind fehl -> komische Sache) -> es kommt zu einer AlreadyBoundException
- Da ich dies ja im trycatch-Block abgefangen habe, greift nun rebind (was auch mit der Ausgabe rebounded funktionierten müsste)



```
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void bind(java.lang.String, java.rmi.Remote)]
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void bind(java.lang.String, java.rmi.Remote)]
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(2)-127.0.0.1: [127.0.0.1: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(2)-127.0.0.1: [127.0.0.1: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1] exception: 
java.rmi.AlreadyBoundException: gtdcloud
        at sun.rmi.registry.RegistryImpl.bind(RegistryImpl.java:141)
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:403)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1] exception: 
java.rmi.AlreadyBoundException: gtdcloud
        at sun.rmi.registry.RegistryImpl.bind(RegistryImpl.java:141)
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:403)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
REBIND
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
02.09.2010 09:05:47 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
REBOUNDED
RMI erfolgreich gestartet!
```

- und wieder könnte man meinen, dass RMI funktionsfähig ist ... 

Wenn ich mich mit einem Client verbinden möchte, so erhalte ich eine  Exception (ich hab den Client bereits an einer anderen RMI-Server-Implementierung getestet, der Client sollte korrekt sein...)

```
Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
        java.io.EOFException
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at Main.main(Main.java:31)
Caused by: java.io.EOFException
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2570)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1314)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
        at sun.rmi.server.MarshalInputStream.readLocation(MarshalInputStream.java:302)
        at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:245)
        at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1548)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1510)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
        ... 2 more
Java Result: 1
```

Im RMI-Log sieht man folgendes: 


```
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCall
FEINER: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1] exception: 
java.lang.NullPointerException
        at org.apache.catalina.loader.WebappClassLoader.getURLs(WebappClassLoader.java:1435)
        at sun.rmi.server.LoaderHandler.getClassAnnotation(LoaderHandler.java:238)
        at java.rmi.server.RMIClassLoader$2.getClassAnnotation(RMIClassLoader.java:657)
        at java.rmi.server.RMIClassLoader.getClassAnnotation(RMIClassLoader.java:381)
        at sun.rmi.server.MarshalOutputStream.annotateClass(MarshalOutputStream.java:93)
        at sun.rmi.server.MarshalOutputStream.annotateProxyClass(MarshalOutputStream.java:100)
        at java.io.ObjectOutputStream.writeProxyDesc(ObjectOutputStream.java:1241)
        at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1218)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1404)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343)
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:403)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1] exception: 
java.lang.NullPointerException
        at org.apache.catalina.loader.WebappClassLoader.getURLs(WebappClassLoader.java:1435)
        at sun.rmi.server.LoaderHandler.getClassAnnotation(LoaderHandler.java:238)
        at java.rmi.server.RMIClassLoader$2.getClassAnnotation(RMIClassLoader.java:657)
        at java.rmi.server.RMIClassLoader.getClassAnnotation(RMIClassLoader.java:381)
        at sun.rmi.server.MarshalOutputStream.annotateClass(MarshalOutputStream.java:93)
        at sun.rmi.server.MarshalOutputStream.annotateProxyClass(MarshalOutputStream.java:100)
        at java.io.ObjectOutputStream.writeProxyDesc(ObjectOutputStream.java:1241)
        at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1218)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1404)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343)
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:403)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1] exception: 
java.rmi.UnmarshalException: error unmarshalling call header; nested exception is: 
        java.io.StreamCorruptedException: result already in progress
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:277)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
Caused by: java.io.StreamCorruptedException: result already in progress
        at sun.rmi.transport.StreamRemoteCall.getResultStream(StreamRemoteCall.java:181)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:408)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        ... 9 more
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1] exception: 
java.rmi.UnmarshalException: error unmarshalling call header; nested exception is: 
        java.io.StreamCorruptedException: result already in progress
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:277)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
Caused by: java.io.StreamCorruptedException: result already in progress
        at sun.rmi.transport.StreamRemoteCall.getResultStream(StreamRemoteCall.java:181)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:408)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        ... 9 more
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1] exception: 
java.lang.NullPointerException
        at org.apache.catalina.loader.WebappClassLoader.getURLs(WebappClassLoader.java:1435)
        at sun.rmi.server.LoaderHandler.getClassAnnotation(LoaderHandler.java:238)
        at java.rmi.server.RMIClassLoader$2.getClassAnnotation(RMIClassLoader.java:657)
        at java.rmi.server.RMIClassLoader.getClassAnnotation(RMIClassLoader.java:381)
        at sun.rmi.server.MarshalOutputStream.annotateClass(MarshalOutputStream.java:93)
        at sun.rmi.server.MarshalOutputStream.annotateProxyClass(MarshalOutputStream.java:100)
        at java.io.ObjectOutputStream.writeProxyDesc(ObjectOutputStream.java:1241)
        at java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1218)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1404)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1167)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343)
        at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:403)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
02.09.2010 09:35:10 sun.rmi.server.UnicastServerRef logCallException
FEIN: RMI TCP Connection(10)-127.0.0.1: [127.0.0.1] exception: 
java.rmi.UnmarshalException: error unmarshalling call header; nested exception is: 
        java.io.StreamCorruptedException: result already in progress
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:277)
        at sun.rmi.transport.Transport$1.run(Transport.java:177)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:636)
Caused by: java.io.StreamCorruptedException: result already in progress
        at sun.rmi.transport.StreamRemoteCall.getResultStream(StreamRemoteCall.java:181)
        at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:408)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
        ... 9 more
```


Nunja was soll ich sagen ... ich bin verwirrt warum das Ganze nicht so funktioniert wie ich es mir vorstelle. Hat vielleicht jemand eine Idee oder kennt jemand ein ähnliches Problem. Wie bereits erwähnt mache ich das Ganze mit Tomcat 6.0.20, der in NetrBeans 6.8 eingebunden ist... 


Ich bin für jeden Rat dankbar 
Gruß
miggel13


----------



## FArt (2. Sep 2010)

Das ist m.E. der völlig falsche Ansatz.

Du baust im Prinzip einen Applicationserver (oder einen Teil davon) auf Basis einer Webapplikation und eines Webservers nach.

Annahme:
Die RMI Schnittstelle bedient im Prinzip die selbe Logik, die auch deine Webapplikation benutzt.

Die Logik sollte man in Java gießen und entpsrechende Schnittstellen remote (mit unteschiedlichen Protokollen) exposen. Das kann man z.B. mit Spring sehr gut realisieren, aber auch die gängigen Applicationserver bieten gute Möglichkeiten und unterstützen ein derartiges Design.

Ich rate davon ab dich in den Lifecycle der Webapplikation zu hängen und dort Services zu realisieren. Wenn es Tomcat sein muss, dann solltest du deinen RMI Server (wie der Tomcat den HTTP Server) als Service dort integrieren.


----------



## miggel13 (2. Sep 2010)

der Ansatz ist vllt. ein bisschen komisch ... Mein Gedanke dahinter war, dass es vllt. einfacher und praktischer ist, alles in einer WAR-Datei zu verstauen, und wenn diese WAR dann deployed wird sollten alle Dienste (Servlets + RMI-Schnittstelle) out of the box funktionieren. 

Ich weiß nicht, wie ich diesen Service in Tomcat integrieren könnte. Des weiteren müsste ich das ja dann bei jedem Tomcat "einstellen", wo die Servlets + RMIs angeboten werden. 

Mein alternativer Ansatz ist eher, einen separaten (von der Webanwendung unabhängigen) RMI-Server zu erstellen (funktioniert auch bereits).


----------

