Post on 27-Dec-2015
Java RMI Essentials
Based on Mastering RMI
Rickard Oberg
2
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
3
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.
4
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.
5
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.
• LatencyInvocations take much longer to complete.
• SecurityArguments/returned value are sent over a network. Is
privacy an issue?
6
RMI/JRMP Architecture
• Stubs
• Marshalling
• RMI Threading & Network Connection
Management
• Distributed Garbage Collection
• Naming
7
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.
8
MyServer
MyServer Stub
RemoteRef[host=myhost, port=1234, ObjID=0]
JRMP<<call>>
CLIENT
MyServerImpl
MyServer ServerSocket[port=1234]
End-point
<<send>>
Object table
<<access>>
JRMP
exported objects
SERVER
<<call>
MyServer instance maps to ObjID=0
9
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.
10
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;
}
11
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.
12
Implementing the Remote Interface
public class HelloWorldImpl extends UnicastRemoteObject
implements HelloWorld
{
public HelloWorldImpl() throws RemoteException {}
public String helloWorld( String name )
{
return “Hello “ + name + “!”;
}
}
13
Implementing the Remote Interface …
public class HelloWorldImpl implements HelloWorld
{
public HelloWorldImpl() throws RemoteException
{
UnicastRemoteObject.exportObject( this );
}
public String helloWorld( String name )
{
return “Hello “ + name + “!”;
}
}
14
Implementing the Remote Interface …
• UnicastRemoteObject constructor exports the objectMakes it available for incoming invocations.
• The exportObject method does this explicitly.
• Extending UnicastRemoteObject inherits distributed implementations of: – equals, hashCode, & toString.
15
RMI/JRMP Architecture
• Stubs
• Marshalling
• RMI Threading & Network Connection
Management
• Distributed Garbage Collection
• Naming
16
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
Foo Copy of FooBytesSerialization Deserialization
17
Dynamic Classloading
• We defer discussion of this until later.
18
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;}________________________________________________
19
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.
20
RMI/JRMP Architecture
• Stubs
• Marshalling
• RMI Threading & Network Connection
Management
• Distributed Garbage Collection
• Naming
21
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
22
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.
23
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.
24
RMI/JRMP Architecture
• Stubs
• Marshalling
• RMI Threading & Network Connection
Management
• Distributed Garbage Collection
• Naming
25
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.
26
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.
27
RMI/JRMP Architecture
• Stubs
• Marshalling
• RMI Threading & Network Connection
Management
• Distributed Garbage Collection
• Naming
28
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.