140 likes | 312 Views
15 - RMI. Java RMI. Architecture Example Deployment. RMI is a part of J2SE (standard edition), but is used by J2EE) A J2EE server is not nessesary for using RMI. Communikation between different machines. Sockets, RPC and RMI
E N D
Java RMI Architecture Example Deployment RMI is a part of J2SE (standard edition), but is used by J2EE) A J2EE server is not nessesary for using RMI
Communikation between different machines • Sockets, RPC and RMI • For sockets a common protocol on application level is needed to encode and decode sent and received messages • RPC (Remote Procedure Call) pulls the abstraction level for communication up ti procedural level • RMI (Remote Method Invocation) handles communication between objects in different adress spaces.
Distributed Object-application (DOA) • A application, where the server provides remote objects on which methods might be activated from different clients, is called a hvis metoder kan kaldes fra forskellige klienter ”distributed object-application” • DOA needs to: • Localize remote objects • Communicate with remote objects • Handle byte code for objects that are send as a parameter or a return value • RMI can handle this
Example for building a RMI-application • The steps: • Contruct an interface (remote) • Implement the interface • Create a server class • Create a client class • Compile it (javac og rmic) • Run the application start rmi-registry (not nessesary from java 1.5), server and klient
Oprettelse af interface import java.rmi.*; public interface Hello extends Remote { public String getGreeting() throws RemoteException; } • Java.rmi.Remote is a interface that all RMI-application must inherit from • Java.rmi.RemoteException is the superclass for exceptions that RMI can throw and shall always be handled
Implementation af interfacet import java.rmi.*; import java.rmi.server.*; public class HelloImpl extends UnicastRemoteObject implements Hello{ public HelloImpl() throws RemoteException { //Default constructor is implemented because of RemoteException } public String getGreeting() throws RemoteException { return ("Hello there!"); } }
Server class //Server. import java.rmi.*; public class HelloServer{ private static final String HOST = "localhost"; public static void main(String[] args) throws Exception{ HelloImpl temp = new HelloImpl(); String rmiObjectName = "rmi://" + HOST + "/Hello"; //Could omit host name, since 'localhost' would be //assumed by default. Naming.rebind(rmiObjectName,temp); System.out.println("Binding complete...\n"); } }
Client class import java.rmi.*; public class HelloClient{ private static final String HOST = "localhost"; public static void main(String[] args){ try{ Hello greeting = (Hello)Naming.lookup("rmi://" + HOST + "/Hello"); System.out.println("Message received: " + greeting.getGreeting()); } catch(ConnectException conEx){ System.out.println("Unable to connect to server!"); } catch(Exception e){ e.printStackTrace(); } } }
Generate the stub • We still missing the piece of code that handles the communication. • It is placed in the file HelloImpl_Stub The file is generated by running rmic.exe på impl-filen:rmic –v1.2 HelloImpl From JDK 1.5 this is done automaticly
How does it function? - Deployment • To make the client run: the HelloClient, Hello and HelloImpl_stubmust be present on the client • HelloServer, Hello, HelloImpl and HelloImpl_stub must be present on the server • The stub is a proxy class for the remote-object. The stub takes care of the communication between the client and the server by marshalling/unmarshalling • The client knows how to manipulate the server object because yhe server object implements the interface that is also known on the client
RMIRegistry • Rmiregistry is a program that handles the nameservice. • Registry shall be started before the server is started(This is done automatically in jdk1.5+) • The rebind-method of the server binds a name (URL) to the implementation object on the server. • The client can use the lookup method to get a reference to the impl-object • Add your server files to classpath in order for rmiregistry to find them. • Rmiregistry is started from the command promt by: start rmiregistry
Call semantics • When a method is called on a remote object, there is two ways of passing the parameters dependent of whether the parameter (and the return value) is a remote object or not. • If remote then is call-by-reference • If not then it is call-by-value (copy) • Objects that are sent by copy shall implement the interface Serializable