220 likes | 332 Views
EEC-681/781 Distributed Computing Systems. Lecture 5 Wenbing Zhao Department of Electrical and Computer Engineering Cleveland State University wenbing@ieee.org. Outline. Case study: Java RMI Material taken from http://java.sun.com/developer/onlineTraining/rmi/RMI.html.
E N D
EEC-681/781Distributed Computing Systems Lecture 5 Wenbing Zhao Department of Electrical and Computer Engineering Cleveland State University wenbing@ieee.org
Outline • Case study: Java RMI • Material taken from http://java.sun.com/developer/onlineTraining/rmi/RMI.html EEC-681: Distributed Computing Systems
Java RMI Architecture • Design goal: to create a Java distributed objectmodel that integrates naturally into the Java programming language and the local object model • The definition of a remote service is coded using a Java interface • The implementation of the remote service is coded in a class • Interfaces define behavior and classes define implementation EEC-681: Distributed Computing Systems
Client Program Server Program Stubs & Skeletons Stubs & Skeletons RMI System Remote Reference Layer Remote Reference Layer Transport Layer Java RMI Architecture Layers • Stub and Skeleton layer: intercepts method calls made by the client to the interface and redirects these calls to a remote RMI service • Remote reference layer: to interpret and manage references made from clients to the remote service objects • Transport layer: provides basic connectivity, as well as some firewall penetration strategies EEC-681: Distributed Computing Systems
<<Interface>> Subject RealSubject Proxy Request() Request() Request() Stub and Skeleton Layer • Java RMI follows the Proxy pattern • The stub class plays the role of the proxy • The remote service implementation class plays the role of the RealSubject EEC-681: Distributed Computing Systems
Remote Reference Layer • Defines and supports the invocation semantics of the RMI connection • This layer provides a RemoteRef object that represents the link to the remote service implementation object • The stub objects use the invoke()method in RemoteRef to forward the method call • The RemoteRef object understands the invocation semantics for remote services EEC-681: Distributed Computing Systems
Transport Layer • The Transport Layer makes network connection between JVMs • Java Remote Method Protocol (JRMP): Java RMI’s wire protocol (proprietary) on top of TCP/IP EEC-681: Distributed Computing Systems
RMI Registry • RMI Registry (rmiregistry): a simple naming service that comes with Java RMI • It runs on each machine that hosts remote service objects, by default on port 1099 • It accepts registration request only from the local RMI servers • It accepts queries for services anywhere EEC-681: Distributed Computing Systems
RMI Registry • To access the remote server from client side: • Query a registry by invoking the lookup()method on the static Naming class • The method lookup()accepts a URL that specifies the server host name and the name of the desired service • rmi://<host_name>[:<name_service_port>]/<service_name> • The method returns a remote reference to the service object EEC-681: Distributed Computing Systems
Steps to Create a Remote Service • First create a local object that implements that service • Next, export that object to Java RMI. When the object is exported, Java RMI creates a listening service that waits for clients to connect and request the service • After exporting, register the object in the Java RMI Registry under a public name EEC-681: Distributed Computing Systems
Using Java RMI • A working Java RMI system is composed of several parts: • Interface definitions for the remote services • Implementations of the remote services • Stub and Skeleton files • A server to host the remote services • An RMI Naming service that allows clients to find the remote services • A class file provider (an HTTP or FTP server) • A client program that needs the remote services EEC-681: Distributed Computing Systems
Steps to Build a System • Design your system • Write and compile Java code for interfaces • Write and compile Java code for implementation classes • Generate Stub and Skeleton class files from the implementation classes • Write Java code for a remote service host program • Develop Java code for Java RMI client program • Install and run Java RMI system EEC-681: Distributed Computing Systems
Service Interface public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; } To compile it: > javac Calculator.java EEC-681: Distributed Computing Systems
Implementation of Remote Service public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject implements Calculator { // Implementations must have an explicit constructor // in order to declare the RemoteException exception public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; } … EEC-681: Distributed Computing Systems
Stubs and Skeletons • To generate the stub and skeleton files, invoke the RMI compiler, rmic • The compiler runs on the remote service implementation class file > rmic CalculatorImpl • After you run rmic you should find the file CalculatorImpl_Stub.class EEC-681: Distributed Computing Systems
Host Server • Remote RMI services must be hosted in a server process import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("rmi://localhost:1099/CalculatorService", c); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); } } EEC-681: Distributed Computing Systems
Client import java.rmi.Naming; import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.NotBoundException; public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator) Naming.lookup( "rmi://localhost/CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); } … EEC-681: Distributed Computing Systems
Running the RMI System • Make sure you change to the directory that contains the classes you have written • Launch a terminal, start Java RMI registry > rmiregistry • Launch another terminal, start the server > java CalculatorServer • Launch the 3rd terminal, start the client > java CalculatorClient EEC-681: Distributed Computing Systems
Parameter Passing in Java RMI • When Java RMI calls involve passing parameters or accepting a return value • How does RMI transfer these between JVMs? • What semantics are used? • Does RMI support pass-by-value or pass-by-reference? EEC-681: Distributed Computing Systems
Parameter Passing in Java RMI • Primitive parameters: pass by value • For both input parameter and return type, Java RMI makes a copy of a primitive data type and send it to the destination • Object parameters: pass by value • The object to be passed, together with all the objects it references, are serialized and copied over EEC-681: Distributed Computing Systems
Parameter Passing in Java RMI • Remote object parameters: pass by reference • A client can obtain a reference to a remote object through the Java RMI Registry program • A client can obtain a remote reference as a result of making a remote method call EEC-681: Distributed Computing Systems
Distributed Garbage Collection in Java RMI • Java takes care of memory management • Distributed garbage collection is needed in Java RMI • Many challenges to do so. Most prominent problem is that a client might quit without notice • Solution: lease based. The resource is granted to a client for certain period of time. It is the client’s responsibility to renew the lease. The resource is reclaimed if lease is not renewed EEC-681: Distributed Computing Systems