1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

RMI als Eclipse Plug-In

Dieses Thema im Forum "Java" wurde erstellt von d-n-r, 30. März 2007.

  1. d-n-r

    d-n-r Grünschnabel

    Hallo Leute,

    es ist mir bewusst, dass es über das Thema schon einige Beiträge gibt, trotzdessen war es mir leider nicht möglich mein Plug-In zum Laufen zu bewegen. Ich hoffe jemand kann mir einen Tipp geben.

    Ich möchte einen RMI Server starten und das ganze als Eclipse Plug-In. Hier ist der (völlig abgespeckte) Code des Servers:

    Code (Text):
    1. public class TestServerImpl extends UnicastRemoteObject implements TestServer {
    2.  
    3.     private static final long serialVersionUID = -4030374539549388613L;
    4.  
    5.     private TestServerImpl() throws RemoteException {
    6.         super();
    7.     }
    8.  
    9.     public static void startTestServer() {
    10.         try {
    11.             LocateRegistry.createRegistry(1234);
    12.         } catch (RemoteException e2) {
    13.             e2.printStackTrace();
    14.         }
    15.        
    16.         String serverName = null;
    17.         try {
    18.             serverName = "rmi://" + InetAddress.getLocalHost().getHostAddress() + ":1234/TestServer";
    19.         } catch (UnknownHostException e1) {
    20.             e1.printStackTrace();
    21.         }
    22.  
    23.         TestServerImpl server = null;
    24.         try {
    25.             server = new TestServerImpl();
    26.         } catch (Exception e) {
    27.             e.printStackTrace();
    28.         }
    29.        
    30.         try {
    31.             Naming.rebind(serverName, server);
    32.             System.out.println (serverName + " bound to rmi registry, at port " + "1234" + ".");
    33.         } catch (RemoteException e) {
    34.             System.out.println ("Rebinding " + serverName + " failed.");
    35.             e.printStackTrace();
    36.         } catch (MalformedURLException e) {
    37.             e.printStackTrace();
    38.         }
    39.     }
    40.  
    41.  
    42.     public void test() throws RemoteException {
    43.     }
    Das gibt mir die folgende Exception:

    Code (Text):
    1. java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    2.     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    3.     java.lang.ClassNotFoundException: servertest.TestServer (no security manager: RMI class loader disabled)
    4. ...
    Ok. Kein SecurityManager. Also habe ich den SecurityManager hinzugefügt. Hier nochmal der Code:

    Code (Text):
    1. public class TestServerImpl extends UnicastRemoteObject implements TestServer {
    2.  
    3.  
    4.     private static final long serialVersionUID = -4030374539549388613L;
    5.  
    6.     private TestServerImpl() throws RemoteException {
    7.         super();
    8.     }
    9.  
    10.     public static void startTestServer() {
    11.         System.setProperty("java.security.policy", "d:/rmi.policy");
    12.         System.setProperty("java.rmi.server.ignoreStubClasses","true");
    13.         if(System.getSecurityManager() == null) {
    14.             System.setSecurityManager(new RMISecurityManager());
    15.         }
    16.        
    17.         try {
    18.             LocateRegistry.createRegistry(1234);
    19.         } catch (RemoteException e2) {
    20.             e2.printStackTrace();
    21.         }
    22.        
    23.         String serverName = null;
    24.         try {
    25.             serverName = "rmi://" + InetAddress.getLocalHost().getHostAddress() + ":1234/TestServer";
    26.         } catch (UnknownHostException e1) {
    27.             e1.printStackTrace();
    28.         }
    29.  
    30.         TestServerImpl server = null;
    31.         try {
    32.             server = new TestServerImpl();
    33.         } catch (Exception e) {
    34.             e.printStackTrace();
    35.         }
    36.        
    37.         try {
    38.             Naming.rebind(serverName, server);
    39.             System.out.println (serverName + " bound to rmi registry, at port " + "1234" + ".");
    40.         } catch (RemoteException e) {
    41.             System.out.println ("Rebinding " + serverName + " failed.");
    42.             e.printStackTrace();
    43.         } catch (MalformedURLException e) {
    44.             e.printStackTrace();
    45.         }
    46.     }
    47.  
    48.  
    49.     public void test() throws RemoteException {
    50.     }
    51. }
    Damit gibt es folgende Exception:

    Code (Text):
    1. java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    2.     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    3.     java.lang.ClassNotFoundException: servertest.TestServer
    4.     at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
    5.     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
    6.     at sun.rmi.transport.Transport$1.run(Transport.java:153)
    7.     at java.security.AccessController.doPrivileged(Native Method)
    8.     at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
    9.     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
    10.     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
    11.     at java.lang.Thread.run(Thread.java:595)
    12.     at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
    13.     at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
    14.     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343)
    15.     at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    16.     at java.rmi.Naming.rebind(Naming.java:160)
    17.     at servertest.TestServerImpl.startTestServer(TestServerImpl.java:59)
    18.     at servertest.TestView$1.run(TestView.java:108)
    19.     at org.eclipse.jface.action.Action.runWithEvent(Action.java:499)
    20.     at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:539)
    21.     at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:488)
    22.     at org.eclipse.jface.action.ActionContributionItem$6.handleEvent(ActionContributionItem.java:441)
    23.     at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
    24.     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
    25.     at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
    26.     at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
    27.     at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1930)
    28.     at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1894)
    29.     at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:422)
    30.     at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
    31.     at org.eclipse.ui.internal.ide.IDEApplication.run(IDEApplication.java:95)
    32.     at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
    33.     at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
    34.     at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
    35.     at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
    36.     at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
    37.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    38.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    39.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    40.     at java.lang.reflect.Method.invoke(Method.java:585)
    41.     at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
    42.     at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
    43.     at org.eclipse.core.launcher.Main.run(Main.java:977)
    44.     at org.eclipse.core.launcher.Main.main(Main.java:952)
    45. Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    46.     java.lang.ClassNotFoundException: servertest.TestServer
    47.     at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    48.     at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
    49.     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
    50.     at sun.rmi.transport.Transport$1.run(Transport.java:153)
    51.     at java.security.AccessController.doPrivileged(Native Method)
    52.     at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
    53.     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
    54.     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
    55.     at java.lang.Thread.run(Thread.java:595)
    56. Caused by: java.lang.ClassNotFoundException: servertest.TestServer
    57.     at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    58.     at java.security.AccessController.doPrivileged(Native Method)
    59.     at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    60.     at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    61.     at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    62.     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    63.     at java.lang.Class.forName0(Native Method)
    64.     at java.lang.Class.forName(Class.java:242)
    65.     at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:707)
    66.     at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:651)
    67.     at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:588)
    68.     at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628)
    69.     at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)
    70.     at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)
    71.     at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1500)
    72.     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1463)
    73.     at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
    74.     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
    75.     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    76.     ... 9 more
    Das Policy-File liegt natürlich in d:\rmi.policy und gibt alle Permissions.

    Ich hoffe jemand hat vielleicht einen guten Hinweis für mich.
    Vielen Dank schonmal.

    Edit: java5, Eclipse 3.2

    Gruß,
    Dominik
     
    Zuletzt bearbeitet: 30. März 2007
  2. Zilchinger

    Zilchinger Mitglied

    Hallo d-n-r :).
    Sieht so aus, als würden da die Stubs und Skeletons nicht richtig erzeugt werden!
    Hast Du denn schonmal ausprobiert, ob das ganze normal lauffähig ist? Sprich nicht gleich als Eclipse Plugin?

    Wir können ja morgen nochmal zusammen drüber schauen, hehe

    Bis denne,
    Zilchinger
     
  3. Thomas Darimont

    Thomas Darimont Premium-User

    Hallo,

    ich glaube das du zum einen den Classpath der RMI Registry nicht richtig gesetzt hast und zum anderen die Stubs nicht richtig genriert hast oder das du die RMI Runtime nicht so konfiguriert hast das diese die Stubs selber generieren soll (Das geht übrigens seit Java 5).

    Also Skeletons braucht man schon seit Java 1.3 nicht mehr und die Stubs sind seit Java 5 auch optional.

    schau mal hier:
    http://www.tutorials.de/forum/java/231847-rmi-unter-java-5-a.html

    Gruß Tom
     
  4. Thomas Darimont

    Thomas Darimont Premium-User

    Hallo,

    bei mir funktioniert folgendes ohne Probleme:
    3 Plugins:
    de.tutorials.eclipse.services (Services)
    de.tutorials.eclipse.server (Server)
    de.tutorials.eclipse.client (Client)

    Das Services Plugin enthält die Service Interfaces. Das Server sowie das Client Plugin sind von dem
    Services Plugin abhängig. Das Services Plugin exportiert die Service-Interfaces.

    Unser ITimeService Interface im Services Plugin:
    Code (Java):
    1. /**
    2.  *
    3.  */
    4. package de.tutorials.eclipse.services.timeservice;
    5.  
    6. import java.rmi.Remote;
    7. import java.rmi.RemoteException;
    8. import java.util.Date;
    9.  
    10. /**
    11.  * @author Thomas.Darimont
    12.  *
    13.  */
    14. public interface ITimeService extends Remote {
    15.     Date getSystemTime() throws RemoteException;
    16. }
    Unser Server Plugin: RMI Registry hoch ziehen / Service Implementierung registrieren:

    unsere Service Implementierung:
    Code (Java):
    1. /**
    2.  *
    3.  */
    4. package de.tutorials.eclipse.server.services.timeservice.internal;
    5.  
    6. import java.rmi.RemoteException;
    7. import java.rmi.server.UnicastRemoteObject;
    8. import java.util.Date;
    9.  
    10. import de.tutorials.eclipse.services.timeservice.ITimeService;
    11.  
    12. /**
    13.  * @author Thomas.Darimont
    14.  *
    15.  */
    16. public class TimeServiceImpl extends UnicastRemoteObject implements
    17.         ITimeService {
    18.  
    19.     public TimeServiceImpl() throws RemoteException {
    20.         super();
    21.         System.out.println("TimeService created");
    22.     }
    23.  
    24.     public Date getSystemTime() {
    25.         return new Date();
    26.     }
    27. }
    Der Activator des Servers:
    Code (Java):
    1. package de.tutorials.eclipse.server;
    2.  
    3. import java.rmi.registry.LocateRegistry;
    4. import java.rmi.registry.Registry;
    5. import java.rmi.server.RemoteStub;
    6. import java.rmi.server.UnicastRemoteObject;
    7.  
    8. import org.osgi.framework.BundleActivator;
    9. import org.osgi.framework.BundleContext;
    10.  
    11. import de.tutorials.eclipse.server.services.timeservice.internal.TimeServiceImpl;
    12. import de.tutorials.eclipse.services.timeservice.ITimeService;
    13.  
    14.  
    15. public class Activator implements BundleActivator {
    16.  
    17.     private Registry registry;
    18.    
    19.     private int port = 1099;
    20.    
    21.     public void start(BundleContext context) throws Exception {
    22.         this.registry = LocateRegistry.createRegistry(this.port);
    23.         this.registry.rebind(ITimeService.class.getName(), new TimeServiceImpl());
    24.         System.out.println("Started RMI Registry on Port: " + port);
    25.     }
    26.  
    27.     public void stop(BundleContext context) throws Exception {
    28.         System.out.println("Shutting down RMI Registry");
    29.     }
    30. }
    Der Client Activator:
    Code (Java):
    1. package de.tutorials.eclipse.client;
    2.  
    3. import java.rmi.registry.LocateRegistry;
    4. import java.rmi.registry.Registry;
    5. import java.util.concurrent.TimeUnit;
    6.  
    7. import org.osgi.framework.BundleActivator;
    8. import org.osgi.framework.BundleContext;
    9.  
    10. import de.tutorials.eclipse.services.timeservice.ITimeService;
    11.  
    12. public class Activator implements BundleActivator {
    13.  
    14.     public void start(BundleContext context) throws Exception {
    15.         Registry registry = LocateRegistry.getRegistry();
    16.         ITimeService timeService = (ITimeService)registry.lookup(ITimeService.class.getName());
    17.         System.out.println("Client: " + timeService.getSystemTime());
    18.     }
    19.    
    20.     public void stop(BundleContext context) throws Exception {
    21.         //noop
    22.     }
    23. }
    Startet man nun Server und Services Plugins mit dem Equinox Framework Launcher, so bekommt man folgende Ausgabe:
    [Server]
    Code (Text):
    1. TimeService created
    2. Started RMI Registry on Port: 1099
    Anschließend startet man das Client plugin mit einem separaten Equinox Launcher. Hier sieht man dann eine ähnliche Ausgabe:
    [Client]
    Code (Text):
    1. Client: Mon Apr 02 19:06:38 CEST 2007
    Nur nebenbei Angemerkt... mit dem Springframework (http://www.springframework.org/) kann man einen Service wunderbar einfach per RMI Expotieren: http://static.springframework.org/spring/docs/2.0.x/reference/remoting.html#remoting-rmi
    Das schöne dabei ist dann u.a, dass man seine Service-interfaces nicht von java.rmi.Remote ableiten muss, dass die Service Methoden keine RemoteException deklarieren müssen, das man den Serviice nicht von Hand über ein UnicastRemoteObject exportieren muss.

    Gruß Tom
     

    Anhänge:

  5. d-n-r

    d-n-r Grünschnabel

    Hallo Thomas,

    also mal vielen Dank für die Vorschläge und Deine Mühe.

    Ich habe Deine Plugins gerade ausprobiert und sie laufen bei mir auch mit dem Equinox Launcher. Allerdings habe ich leider keine Erfahrung mit reinen Equinox Anwendungen und kann daher die Unterschiede zu Eclipse-Plugins nicht richtig überschauen. Wenn ich das beim Drüberlesen richtig verstanden habe, ist Equinox ja die Platform plus das OSGI Framework

    Wie dem auch sei, nach einiger Arbeit haben wir (Zilchinger und ich) das Ding doch noch zum Laufen bekommen und hier ist meine Lösung für alle die das gleiche Problem haben:

    Das Problem ist in der Tat, das der Plugin-Classloader die Interfaces nicht finden kann. Lösen lässt sich das Problem durch Setzen des
    Code (Text):
    1. java.rmi.server.codebase
    Property, gerne auch programmatisch:

    Code (Text):
    1. System.setProperty("java.rmi.server.codebase", path);
    Tricky an der ganzen Sache ist, dass Leerzeichen nicht erlaubt sind. Andererseits haut eine URL-Codierung mit
    Code (Text):
    1. URLEncoder.encode
    auch nicht hin. Ersetzt man allerdings alle " " mit %20 findet der Classloader auf wundersame Weise alle Interfaces und der Server fährt hoch.

    Um das Verzeichnis des Plugins rauszufinden bin ich über
    Code (Text):
    1. Activator.getDefault().getBundle()
    und
    Code (Text):
    1. URL url = FileLocator.find(bundle, new Path("/bin/"), null);
    gegangen. Damit bekommt man den Pfad, den man dann mit dem codebase Property setzen kann.

    Vielen Dank auch für den Hinweis auf das Spring Framework. Ich werde es mit in der Tat demnächst mal anschauen, doch da ich etwas unter Zeitdruck stehe, begnüge ich mich für den Moment mit der funktionierenden RMI Variante.

    Vielen Dank nochmal,
    Gruß,
    Dominik
     
  6. Thomas Darimont

    Thomas Darimont Premium-User

    Hallo,

    hier mal noch eine alternative Implementierung, bei der unser Service nicht von UnicastRemoteObject abgeleitet sein muss:

    Unsere neue Service Implementierung / Interface wie oben:
    Code (Java):
    1. /**
    2.  *
    3.  */
    4. package de.tutorials.eclipse.server.services.timeservice.internal;
    5.  
    6. import java.util.Date;
    7.  
    8. import de.tutorials.eclipse.services.timeservice.ITimeService;
    9.  
    10. /**
    11.  * @author Thomas.Darimont
    12.  */
    13. public class TimeServiceImpl implements ITimeService {
    14.  
    15.   public TimeServiceImpl() {
    16.     System.out.println("TimeService created");
    17.   }
    18.  
    19.  
    20.   public Date getSystemTime() {
    21.     return new Date();
    22.   }
    23. }
    Unser Server Activator:
    Code (Java):
    1. package de.tutorials.eclipse.server;
    2.  
    3. import java.rmi.registry.LocateRegistry;
    4. import java.rmi.registry.Registry;
    5. import java.rmi.server.UnicastRemoteObject;
    6.  
    7. import org.osgi.framework.BundleActivator;
    8. import org.osgi.framework.BundleContext;
    9.  
    10. import de.tutorials.eclipse.server.services.timeservice.internal.TimeServiceImpl;
    11. import de.tutorials.eclipse.services.timeservice.ITimeService;
    12.  
    13. public class Activator implements BundleActivator {
    14.  
    15.   private Registry registry;
    16.  
    17.   private int port = 10099;
    18.  
    19.  
    20.   public void start(BundleContext context) throws Exception {
    21.     System.setProperty("java.rmi.server.ignoreStubClasses", "true");
    22.     this.registry = LocateRegistry.createRegistry(this.port);
    23.     try {
    24.       this.registry.rebind(ITimeService.class.getName(), UnicastRemoteObject.exportObject(new TimeServiceImpl(),
    25.         9999));
    26.     } catch (Throwable throwable) {
    27.       throwable.printStackTrace();
    28.     }
    29.     System.out.println("Started RMI Registry on Port: " + port);
    30.   }
    31.  
    32.  
    33.   public void stop(BundleContext context) throws Exception {
    34.     System.out.println("Shutting down RMI Registry");
    35.   }
    36. }
    Unser Client Activator:
    Code (Java):
    1. package de.tutorials.eclipse.client;
    2.  
    3. import java.rmi.registry.LocateRegistry;
    4. import java.rmi.registry.Registry;
    5.  
    6. import org.osgi.framework.BundleActivator;
    7. import org.osgi.framework.BundleContext;
    8.  
    9. import de.tutorials.eclipse.services.timeservice.ITimeService;
    10.  
    11. public class Activator implements BundleActivator {
    12.  
    13.   public void start(BundleContext context) throws Exception {
    14.     System.setProperty("java.rmi.server.ignoreStubClasses", "true");
    15.     Registry registry = LocateRegistry.getRegistry("srv01", 10099);
    16.     ITimeService timeService;
    17.     try {
    18.       timeService = (ITimeService) registry.lookup(ITimeService.class.getName());
    19.       System.out.println("Client: " + timeService.getSystemTime());
    20.     } catch (Throwable t) {
    21.       t.printStackTrace();
    22.     }
    23.   }
    24.  
    25.  
    26.   public void stop(BundleContext context) throws Exception {
    27.     // noop
    28.   }
    29. }
    Auch hier werden die beiden Plugins über separate Equinox-Launcher gestartet...
    Über das JVM System Property java.rmi.server.ignoreStubClasses Teilen wir der RMI Runtime mit, dass anstatt etwaig vorhandener Stubs Dynamic Proxies verwendet werden sollen.

    Gruß Tom
     
  7. alexb-ose

    alexb-ose Grünschnabel


    Hallo, Thomas.
    Habe den Thread entdeckt, weil ich auch Probleme mit RMI in der OSG-Umgebung habe.
    Dein Beispiel funktioniert einwandfrei. Aber ich ging einen Schritt weiter und versuchte das Remoting über Springframework zu realisieren.
    Dafür habe ich die Spring-Bundles eingestzt:
    http://www.springsource.com/reposit...&searchType=bundlesByName&searchQuery=context

    Es ist mir gelungen (mit ClassLoader-Krücken) den Service auf der Server-Seite einzubinden (org.springframework.remoting.rmi.RmiServiceExporter) und auf der Client-Seite zu connecten (org.springframework.remoting.rmi.RmiProxyFactoryBean).
    Bei Aufrufen ohne Parameter gibt es auch keine Probleme. Nur wenn man eine Funktion mit Parameter auf der Client-Seite aufruft, wird die Parameter-Klasse auf der Server-Seite nicht gefunden:


    osgi> TimeService created
    java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:619)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at org.springframework.remoting.rmi.RmiServiceExporter.prepare(RmiServiceExporter.java:286)
    at org.springframework.remoting.rmi.RmiServiceExporter.afterPropertiesSet(RmiServiceExporter.java:227)
    at de.tutorials.eclipse.server.Activator.start(Activator.java:57)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
    at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
    Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.ClassNotFoundException: org.springframework.remoting.rmi.RmiInvocationWrapper_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
    at java.io_ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
    at java.io_ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io_ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io_ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io_ObjectInputStream.readObject(ObjectInputStream.java:351)
    ... 12 more
    org.springframework.remoting.RemoteLookupFailureException: Could not find RMI service [rmi://localhost:2445/ITimeService2] in RMI registry; nested exception is java.rmi.NotBoundException: ITimeService2
    at org.springframework.remoting.rmi.RmiClientInterceptor.lookupStub(RmiClientInterceptor.java:210)
    at org.springframework.remoting.rmi.RmiClientInterceptor.prepare(RmiClientInterceptor.java:146)
    at org.springframework.remoting.rmi.RmiClientInterceptor.afterPropertiesSet(RmiClientInterceptor.java:134)
    at org.springframework.remoting.rmi.RmiProxyFactoryBean.afterPropertiesSet(RmiProxyFactoryBean.java:67)
    at de.tutorials.eclipse.client.Activator.start(Activator.java:34)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:999)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:993)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:974)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:346)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:350)
    at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1118)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:634)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:508)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:282)
    at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:468)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:195)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:297)
    Caused by: java.rmi.NotBoundException: ITimeService2
    at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:106)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:619)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:84)
    at org.springframework.remoting.rmi.RmiClientInterceptor.lookupStub(RmiClientInterceptor.java:199)
    ... 17 more

    Wäre Dir dankbar, wenn du etwas Licht in das Thema reinbringen würdest.

    Gruss, Alex
     

    Anhänge:

  8. Thomas Darimont

    Thomas Darimont Premium-User

  9. alexb-ose

    alexb-ose Grünschnabel

    Hallo, Tom.
    Bin heute endlich dazu gekommen meine OSGI-RMI-Tests fortzusetzen.
    Der Einsatz von Spring-DM hat mich aber nicht wirklich weiter gebracht.
    Also, alles nacheinandern
    .
    Habe Deinen TimeSrvice-Server so angepasst, dass er mit Spring-DM aktiviert wird. Dazu den Activator rausgenommen und die Spring-Conf-Dateien unter META-INF/spring eingestellt. Der Start des OSGI-Frameworks erfolgt ohne Probleme:
    Code (Text):
    1. Framework is launched.
    2.  
    3. id  State       Bundle
    4. 0   ACTIVE      system.bundle_3.2.2.R32x_v20070118
    5. 1   ACTIVE      org.springframework.osgi.aopalliance.osgi_1.0.0.SNAPSHOT
    6. 2   ACTIVE      de.tutorials.eclipse.server_1.0.0
    7. 3   ACTIVE      org.springframework.osgi.log4j.osgi_1.2.15.SNAPSHOT
    8.                 Fragments=17
    9. 4   ACTIVE      org.springframework.bundle.spring.context.support_2.5.4
    10. 5   ACTIVE      org.springframework.bundle.spring.core_2.5.4
    11. 6   ACTIVE      org.springframework.bundle.osgi.core_1.1.0.m2
    12. 7   ACTIVE      jcl104.over.slf4j_1.4.3
    13. 8   ACTIVE      org.springframework.bundle.spring.beans_2.5.4
    14. 9   ACTIVE      org.springframework.bundle.spring.aop_2.5.4
    15. 10  ACTIVE      slf4j.log4j12_1.4.3
    16. 11  ACTIVE      org.springframework.osgi.cglib-nodep.osgi_2.1.3.SNAPSHOT
    17. 12  ACTIVE      org.springframework.bundle.spring.context_2.5.4
    18. 13  ACTIVE      org.springframework.bundle.osgi.extender_1.1.0.m2
    19. 14  ACTIVE      de.tutorials.eclipse.services_1.0.0
    20. 15  ACTIVE      org.springframework.bundle.osgi.io_1.1.0.m2
    21. 16  ACTIVE      slf4j.api_1.4.3
    22. 17  RESOLVED    log4j_config_1.0.0
    23.                 Master=3
    Der Time-Service wird im OSGI registriert und als RMI-Service exportiert.

    Den OSGI-Client habe ich nicht gestartet. Dafür habe ich eine einfache Main-Klasse im Service-Projekt für den RMI-Test eingesetzt.

    Das Ergebnis unterscheidet sich nicht von dem ohne Spring-DM: Die Parameter-Klasse wird im Server nicht gefunden.
    Hätte mich auch gewundert, wenn es anders wäre. Ich meine, wenn ich mit einem Schaltgetriebe nicht durchkomme, komme ich mit einer Automatik erst recht nicht durch:)

    Gruß Alex
     

    Anhänge:

Die Seite wird geladen...