RMI im JBoss

smoothny

Grünschnabel
Hallo!

Ich brüte schon ein paar Stunden über einem Problem mit RMI im JBoss
Portal. Ich hab in einem Portlet einem Portlet den RMI Server bereitgestellt:

PlayableGamesContainer playableGamesContainer = new PlayableGamesContainer(); portletConfig.getPortletContext().setAttribute("playableGamesContainer", playableGamesContainer);
try {
IPortalService bridge = new PortalServiceImpl(playableGamesContainer);
Naming.rebind("rmi://127.0.0.1:1100/PortalService", bridge);
} catch (Exception e) {
throw new PortletException(e);
}


Vom Client aus starte ich folgenden Aufruf:

System.setProperty("java.security.policy", "client.policy");
System.setSecurityManager(new java.rmi.RMISecurityManager());
IPortalService bridge = (IPortalService) Naming
.lookup("rmi://127.0.0.1:1100/PortalService");
IPortalContext game = bridge.registerGame(new GameConfigurationImpl());


Mein Problem ist nun, dass beim Clientaufruf folgende Fehlermeldung kommt:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: gp.bridge.client.GameConfigurationImpl


Das Interface der GameConfigurationImpl steht dem Server zur Verfügung und
die Klasse ist auch Serializeable, aber trotzdem findet er sie nicht. Ist es
überhaupt möglich vom Client an den Server Objekte zu schicken? Wenn ja,
was mache ich falsch? Stelle ich die GameConfigurationImpl dem Server
zur Verfügung, so kommt der Fehler nicht mehr, aber das ist ja nicht der
Sinn der Sache.

Gruß Sascha
 
hab jetzt mal hiermit versucht das problem zu lösen:

System.setProperty("java.rmi.server.codebase","http://localhost:8080/gp-common.jar");
System.setProperty("java.rmi.server.ignoreStubClasses", "true");

aber auch das ändert nichts an dem objectnotfound error
 
Für mich sieht das so aus, als hätte dein Problem nichts mit RMI zu tun. Das Interface deines exportierten Service IPortalService hat eine Methode registerGame mit einem Parameter vom Typ GameConfiguration (also zumindest dem Interface, dass GameConfigurationImpl implementiert).

Jetzt solltest du natürlich auf beiden Seiten eine Implementierung davon haben oder zumindest dynamisch erzeugen können, sonst macht der Methodenaufruf keinen Sinn. Entweder hast du also eine Implementierung für den Client und eine für den Server oder du musst die eine Implementierung, die beide nutzen sollen, auf beiden Seiten im Classpath haben.

Im allgemeinen hat man bei so Remotinggeschichten 3 Jars: eins mit von Client und Server genutzten Interfaces und Datentypen (hier müsste wahrscheinlich IPortalService GameConfigurationImpl + dessen Interface hinein), dann eins für die Clientimplementierung und eins für die Serverimplementierung.

Viel mehr lässt sich ohne nährere Angaben, was du eigentlich machen willst, wie dein Design gedacht ist kaum mutmaßen.

Gruß
Ollie

PS: Bitte benutz Tags für Quellcode jeglicher Art. Sonst liest sich der Kram sauschwer.
 
Hallo!

Total vergessen zu antworten! Das Problem ist gelöst! Hatte da wohl ein paar
Interpretationsprobleme was RMI betrifft. :)

Gruß Sascha
 
Hallo smoothny,

ich habe das selbe Problem! Auch ich baue innerhalb einer JBOSS-Applikation eine RMI-Verbindung zu einem RMI-Server auf. Solange ich als Parameter Standarddatentypen für den entferten Methodenaufruf verwende, habe ich keine Probleme. Sobald ich aber eine eigene complexeren Datentyp / Klasse als Parameter verwendete bekommen ich folgende Fehlermeldung im JBoss:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.classNotFoundException: de.hs.webmonitoring.utils.COpticalDevConfWrapper (could not determine preferred setting; first URL:"http://127.0.0.1:8083/")

habe auch schon mit "java.rmi.server.codebase" herumexperimentiert - hatte aber kein Erfolg damit?
Wie hattest Du dein Problem gelöst?

Gruß Hendrik
 

Neue Beiträge

Zurück