280 likes | 304 Views
Java RMI Essentials. Based on Mastering RMI Rickard Oberg. Essentials of Remote Invocation. What is RMI? The Principles of RMI How Does RMI Differ from Ordinary Java RMI/JRMP Architecture Stubs Marshalling RMI Threading & Network Connection Management Distributed Garbage Collection
E N D
Java RMI Essentials Based on Mastering RMI Rickard Oberg
Essentials of Remote Invocation • What is RMI? • The Principles of RMI • How Does RMI Differ from Ordinary Java • RMI/JRMP Architecture • Stubs • Marshalling • RMI Threading & Network Connection Management • Distributed Garbage Collection • Naming • Summary
What is RMI? • RMI is a specification(API) for accessing objects from a remote JVM. • What is specified? • How objects are to be coded. • How objects can be located & invoked. • How parameters & returned values are passed. • Java Remote Method Protocol (JRMP) is Sun’s implementation of the RMI API.
The Principles of RMI • Meta-principle Make RMI like MI as much as possible. • Objects are invoked by calling methods. • Expose interfaces not implementation. • Exceptions report errors in the computation. • GC determines the lifecycle of objects. • Get classes that are not part of system classpath via classloading.
How Does RMI Differ from Local MI? • Remote exceptions • Remote methods throw java.rmi.RemoteExeption. • Pass by value • All arguments are pass-by-value. • Serializing may hurt performance for large objects. • Latency Invocations take much longer to complete. • Security Arguments/returned value are sent over a network. Is privacy an issue?
RMI/JRMP Architecture • Stubs • Marshalling • RMI Threading & Network Connection Management • Distributed Garbage Collection • Naming
Stubs • Stub • The client has a proxy for the remote object: the stub. • The stub implements the remote object’s interface[s]. • The RMI compiler (rmic) generates the stub. • Remote methods invoked by the client are delegated to the JRMP engine. • The JRMP forwards the call to the server. • The server executes the method. • The result is returned to the client.
CLIENT MyServer MyServer Stub JRMP RemoteRef [host=myhost, port=1234, ObjID=0] <<call>> SERVER <<send>> JRMP End-point <<call> MyServer ServerSocket [port=1234] <<access>> MyServerImpl Object table exported objects MyServer instance maps to ObjID=0
The Remote Interface • It is a set of remotely invoked methods. • It has the following characteristics: _______________________________________ public interface MyRemoteInterface extends java.rmi.Remote // possibly indirectly { public <return_type> myMethod( <type> p1, … ) throws java.rmi.RemoteException // declare other remote methods … } _______________________________________ • All parameters & return type are serializable.
The Hello Interface package masteringrmi.helloworld.interfaces; import java.rmi.Remote; import java.rmi.RemoteException; public interface HelloWorld extends Remote { public String helloWorld( String name ) throws RemoteException; }
The Hello Interface … • Style: create a contract package It contains the “contract” between client & server: • Remote interfaces of server objects • Application exceptions throwable by any remote interface • Data container classes for data moved between client & server. • Client & server get contract classes & interfaces. • Server also gets implementation classes.
Implementing the Remote Interface public class HelloWorldImpl extends UnicastRemoteObject implementsHelloWorld { public HelloWorldImpl() throws RemoteException {} public String helloWorld( String name ) { return “Hello “ + name + “!”; } }
Implementing the Remote Interface … public class HelloWorldImpl implementsHelloWorld { public HelloWorldImpl() throws RemoteException { UnicastRemoteObject.exportObject( this ); } public String helloWorld( String name ) { return “Hello “ + name + “!”; } }
Implementing the Remote Interface … • UnicastRemoteObject constructor exports the object Makes it available for incoming invocations. • The exportObject method does this explicitly. • Extending UnicastRemoteObject inherits distributed implementations of: • equals, hashCode, & toString.
RMI/JRMP Architecture • Stubs • Marshalling • RMI Threading & Network Connection Management • Distributed Garbage Collection • Naming
Marshalling • Marshalling creates a byte[] from an object. • Unmarshalling does the reverse. • To marshal, Java serializes the object. • To unmarshal, Java deserializes the byte[]. public class foo implements Serializable Copy of Foo Foo Bytes Serialization Deserialization
Dynamic Classloading • We defer discussion of this until later.
Security • To dynamically download stubs, the client: • Sets a security manager: ______________________________________________________ import java.rmi.RMISecurityManager; . . . if ( System.getSecurityManager() == null ) System.setSecurityManager( new RMISecurityManager() ); ________________________________________________ • Has a policy file that permits downloading ________________________________________________ grant { permission java.security.AllPermission; } ________________________________________________
Class Versioning • Server changes are propagated to clients that subsequently download the stub. • What about running clients that already have the stub? • Basically, this is a problem. • serial version UID can be used to detect incompatibilities. • Jini further ameliorates the version problem.
RMI/JRMP Architecture • Stubs • Marshalling • RMI Threading & Network Connection Management • Distributed Garbage Collection • Naming
RMI Threading & Network Connection Management “Since RMI on the same remote object may execute concurrently, a remote object implementation needs to make sure its implementation is thread-safe.” The RMI specification, section 3.2
Network Connections • RMI specifies socket factory interfaces to get sockets on the client & server: • Java.rmi.server.RMIClientSocketFactory • Java.rmi.server.RMIServerSocketFactory • Override the default implementation (to provide encryption, authentication, …) Selecting an features at run time is desirable: Some jobs want encryption, some do not. • Custom implementations are discussed later.
Threading Model • The JRMP implementation for the server • Instantiates a thread for each connection. • It listens for its associated client’s calls. • It handles each call to completion. • The JRMP implementation for the client • Concurrent calls from a client cause concurrent threads connecting to the server. • This may swamp a server. • If your client makes concurrent calls, you may want a different implementation.
RMI/JRMP Architecture • Stubs • Marshalling • RMI Threading & Network Connection Management • Distributed Garbage Collection • Naming
Distributed Garbage Collection • RMI has distributed garbage collection (DGC). • Server tracks clients who have its stub. • Server keeps a count of such clients. • Count is decremented when client: • explicitly relinquishes reference OR • doesn’t renew its lease (default 10 min.), e.g., client crashed: • “Leasing” is due to Miller & Drexler, in • Incentive Engineering for Computational Resource Management. K. E. Drexler & M. S. Miller, B. A. Huberman (ed.), (Studies in Computer Science & Artificial Intelligence), 1988. • If local & remote references == 0, it is garbage.
The Unreferenced Interface • A server can implement Unreferenced • It has 1 method: unreferenced. • It is called when there are no remote references to the object. • Being bound in the RMI registry counts as a remote reference. • It must unbind itself before unreferenced can be invoked.
RMI/JRMP Architecture • Stubs • Marshalling • RMI Threading & Network Connection Management • Distributed Garbage Collection • Naming
Naming • Rmiregistry allows: • A server to store its (serialized) stub on a web server • A client to download & deserialize the stub. • The essential information: the url of the serialized stub file.