# RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie?



## profressor (9. Nov 2014)

Ich möchte für ein remote object für jeden Aufrufer eine neue Instanz zur verfügung stellen. Das Object selber darf nicht serialisiert (an den client übertragen), sondern muss auf dem Server erzeugt werden. Weiss einer wie man das anstellt? Anscheinen soll es mit einer Factory Impl. möglich sein:

https://docs.oracle.com/javase/7/docs/technotes/guides/rmi/Factory.html

Mir ist dabei nicht klar, in welcher Form die neue Instanz verwaltet und an den Client übergeben werden soll. Beispielcode


```
// RMI: interface
public interface Time extends Remote {
	public long getTime() throws RemoteException;
}

// RMI: implementation
public class TimeImpl extends UnicastRemoteObject implements Time {

	public TimeImpl() throws RemoteException { }	 
	
	public long getTime() throws RemoteException {
		return System.currentTimeMillis();
	}
}


// factory: interface
public interface Factory extends Remote {
	public TimeImpl GetObject() throws RemoteException;
}

// factory: implementation
public class FactoryImpl extends UnicastRemoteObject implements Factory {
	
	public FactoryImpl() throws RemoteException {}	
	
	public TimeImpl GetObject() throws RemoteException {
		TimeImpl ti = new TimeImpl();  // <------------ so gehts leider nicht
		return ti;
	}
}


// RMI: server
public class Server {
	public static void main(String args[]) {
		try {
			//TimeImpl ts = new TimeImpl();
			FactoryImpl fy = new FactoryImpl();
			Registry registry;
			try {
				registry = LocateRegistry.createRegistry(1099);
			}
			catch ( Exception e2 ) {
				registry = LocateRegistry.getRegistry(1099);				
			}
			
			registry.bind( "Time", /*ts*/ fy );
			System.err.println( "Time RMI ready. To stop hit <y>" );
			Scanner sc = new Scanner(System.in);
		    String s = sc.next();
		    if ( s.toLowerCase().equals("y") ) {
		    	registry.unbind( "Time" );
		    	sc.close();
		    	System.exit(0);
		    }
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
	}
}


// RMI: client
public class Client {
	public static void main( String args[] ) {
		try {  
			//Time ref = (Time)Naming.lookup( "rmi://localhost:1099/Time" );
			Factory ref = (Factory)Naming.lookup( "rmi://localhost:1099/Time" );
			TimeImpl newObj = ref.GetObject();
			System.out.println( "Time = " + newObj.getTime() ) ;
		}
	    catch(Exception ex) {
	    	System.out.println( "Exception = " + ex ) ;
	    }
	}
}
```


----------

