# RMI, Eclipse und Cajo



## mdunker (24. Juli 2007)

Hi,

ich versuche mich gerade in das Thema Java und RMI einzuarbeiten. Leider habe ich Probleme mit dem Security Managment bzw. der Policy. Ich bekomme mein Beispiel einfach nicht zum Laufen.

Ich benutze Eclipse 3.3.0, Java 6, EMF und Cajo als RMI Vereinfachung.

Ich poste einfach mal meinen Quellcode:

Hier mein Server:


```
package server;

import gnu.cajo.invoke.Remote;
import gnu.cajo.utils.ItemServer;

import java.io.File;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;

import AnforderungsModell.util.AnforderungsModellResourceFactoryImpl;

public class Start {

	private static Resource reqModel;
	
	public static void main(String args[]) throws Exception {
		// Remote.config(null, 1198, null, 0);
		Remote.config("localhost", 1198, null, 0);
				
		ItemServer.bind(new Start(), "AT_Server");
				
		System.out.println("The server is running!");
	
		reqModel = loadReqModel();
		
	}

	private static Resource loadReqModel() {
		 // Create a resource set.
		   ResourceSet resourceSet = new ResourceSetImpl();

		   resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("anforderungsmodell", new AnforderungsModellResourceFactoryImpl()); 
		     		 
		   // Get the URI of the model file.		 
		   URI fileURI = URI.createFileURI(new File("C:/Programme/Anwendungen/ServerWorkspace/AT_EMFServer/model/My.anforderungsmodell").getAbsolutePath());

		   // Demand load the resource for this file.
		   Resource resource = resourceSet.getResource(fileURI, true);

		return resource;
	}

	public Resource getReqModel() {		
		System.out.println("getReqModel called");
		return reqModel;
	}	
	
	public String test() {
		System.out.println("test called");
		return "erfolgreich";
	}

}
```

Hier ist mein Client: 


```
package rmi;

import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import gnu.cajo.invoke.Remote;

public class ConnectToServer {

	private static Object object;
	
	public ConnectToServer() {
		try {
			object = Remote.getItem("//localhost:1198/AT_Server");
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public Object invoke(String method, String args) {
		try {
			return Remote.invoke(object, method, args);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}
```

Und hier die Main mit der ich das ganze Starte:


```
package rmi;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ConnectToServer connection = new ConnectToServer();	
		System.out.println(connection.invoke("test", null));
		System.out.println(connection.invoke("getReqModel", null));

	}

}
```

Die Ausgabe des Server ist die Folgende:


```
The server is running!
test called
getReqModel called
```

Die Ausgabe des Clients ist dies:

```
erfolgreich
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: AnforderungsModell.util.AnforderungsModellResourceImpl
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173)
	at gnu.cajo.invoke.Remote_Stub.invoke(Unknown Source)
	at gnu.cajo.invoke.Remote.invoke(Unknown Source)
	at rmi.ConnectToServer.invoke(ConnectToServer.java:43)
	at rmi.Test.main(Test.java:11)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: AnforderungsModell.util.AnforderungsModellResourceImpl
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
	at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155)
	... 4 more
Caused by: java.io.NotSerializableException: AnforderungsModell.util.AnforderungsModellResourceImpl
	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
	at java.io.ObjectOutputStream.writeObject(Unknown Source)
	at sun.rmi.server.UnicastRef.marshalValue(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
null
```

Wie man sieht klappt es für einfache Konstrukte wie einen String. Mein EMF Resource Modell verursacht aber einen Fehler. Ich hab schon viele Sachen ausprobiert die mir Google zum Thema Security Manager und Policy im Bezug auf RMI ausgegeben hat, aber nix hat bisher geholfen.

Vielleicht weiss hier ja jmd Rat und hat eine Lösung für mich bei der mein Resouce Modell fehlerfrei übertragen wird.

Mit freundlichem Gruß
Mirco


----------



## dto (25. Juli 2007)

Vielleicht ist dei AnforderungsModellResourceFactoryImpl nicht Serialisierbar zumindest sagt das der Fehler.

Ich vermisse auch irgendwie das Interface zu deinem Remoteobjekt.

Des weiteren kenn ich diese Methode RMI zu nutzen garnicht und finde sie sehr schwer vertändlich für ein Anfängetbeispiel.


----------

