DistributedObjectsRMI

Download Report

Transcript DistributedObjectsRMI

UMBC
Distributed Computing with
Objects
RMI/Corba
CMSC 432
Shon Vick
UMBC
Remote Method Invocation
• RMI
• JAVA-TO-JAVA
• Object running on one JVM can invoke
methods on an object running on another
JVM
• RMI provides communication between
remote Java programs
2
UMBC
Overview
• Sever Creates Remote Objects
• Server Makes References to Them
Accessible
• Server Waits on Remote Method Calls
• Client get References to Remote Objects
• Invokes Methods on Them
• Distributed Objects
3
UMBC
Distributed Objects
• Locate Remote Objects
– Register
– Pass and Return References
• Communicate with Remote Objects
(Transparent to Programmer)
• Load Bytecode and transmit data over
network
4
UMBC
Dynamic Code Loading
• Download code of an objects class if class
not defined in receiver’s virtual machine
• RMI passes objects by true type
• Change behavior of application dynamically
• Compute Example
5
UMBC
Remote Interfaces, Objects, and
Methods
• Distrubed application made up of interfaces
and classes
• Some implementations reside on remote
machines
• Objects with methods on remote VM’s are
remote objects
• Object is remote by implementing remote
interface
6
UMBC
Remote Interfaces
• Extends java.rmi.Remote
• Each remote method must declare
java.rmi.RemoteException
• Remote objects are passed by reference
between virtual machines, not a copy
7
UMBC
Stubs
• Remote reference is a stub
• Local representative or proxy
• Caller invokes method on stub which
carries out method call on remote object
• Stub implements the same set of remote
interfaces as remote object
• Only those methods defined in remote
interface available to caller
8
UMBC
Steps
• Design and Implement Components of
Distributed Application
• Compile Sources and Generate Stubs and
Skeletons
• Make Classes Network Accessible
• Start the Application
9
UMBC
Details
• Object becomes remote by implementing a remote
interface
• java.rmi.Remote
• Methods java.rmi.RemoteException in throws
clause
• Stub is local proxy for remote object. Generated
by rmic compiler
• Skeleton interfaces object and object manager on
Server
10
UMBC
Details, contd.
• Define Remote Interface: specifies remote
methods
• Implement Remote Objects: Implement the
remote interface
• Implement Clients
• Put classes in Web accessible directory: remote
interfaces, stubs, other download classes
• Start registry, start application
11
UMBC
Example
• Generic Compute Engine
• What it computes is not defined when
engine is written
• Take advantage of central powerful machine
• Dynamic
12
UMBC
An Example
package compute;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Compute extends Remote {
Object executeTask(Task t) throws RemoteException;
}
package compute;
import java.io.Serializable;
public interface Task extends Serializable {
Object execute();
}
13
UMBC
How it works
14
UMBC
Interface Details
• Compute allows jobs to be submitted to the
engine
• Task defines how the compute engine
executes the given task. Passed by value
between VM’s
• Return value is an Object
15
package engine;
import java.rmi.*;
import java.rmi.server.*;
import compute.*;
Example
public class ComputeEngine extends UnicastRemoteObject
implements Compute
{
public ComputeEngine() throws RemoteException {
super();
}
public Object executeTask(Task t) {
return t.execute();
}
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
String name = "//host/Compute";
try {
Compute engine = new ComputeEngine();
Naming.rebind(name, engine);
System.out.println("ComputeEngine bound");
} catch (Exception e) {
System.err.println("ComputeEngine exception: " + e.getMessage());
e.printStackTrace();
}
}
}
16
UMBC
Implementing a Remote Interface
• Declare remote interfaces
• Define constructor for Remote object
• Provide implementations for remote
methods
• Create and install security manager
• create instance of remote object
• register remote object with registry
17
UMBC
UnicastRemoteObject
• UnicastRemoteObject: Point to point
communications with socket transport.
Constructor exports object for calls.
• RMISecurityManager as restrictive as
Applet
• Create instance and bind to registry.
Instance is of type Compute. Name is host
where registry is.
18
UMBC
Register
• Front-end for binding (registering) and
looking up remote object is
java.rmi.Naming interface
• Remote VM’s can look up objects by name
in RMI registry.
• Name should inlcude name of host where
registry and remote object run, and a name
that identifies remote object in registry.
19
UMBC
Binding
• Bind remote object to registry
• URL type format for host and name
• Default port is 1099
• rmi::/<host>:<port>/Compute
• RMI runtime substitutes reference to
stub for remote object reference. Remote
object implementations never leave JVM
where created.
•RMI keeps ComputeEngine running
20
UMBC
Stubs
• When client invokes remote method, it
actually calls a regular method on a local
JVM.
• This method is encapsulate in a stub class
(surrogate)
• Stub encodes parameters (marshalling)
• Sends information over network to server
21
UMBC
Skeleton
• Makes sense out of information in packet
from stub (Unmarshals)
• Passes it to actual object on local JVM
• Packages response and sends it back to
client
• Stubs can be on local machine or loaded
across network similar to applet
22
UMBC
Client
Method
Invocation
Marshalling
Stub
Skeleton
Marshalled Parameters
and Return Values
Server
Method
Invocation
23
UMBC
import java.rmi.*;
import java.rmi.server.*;
import java.net.*;
public class HelloServer extends UnicastRemoteObject
implements IHello {
public HelloServer() throws RemoteException {
hiMsg = "Hello, world!";
}
public String sayHi() throws RemoteException {
return hiMsg;
}
public static void main( String[ ] args ) {
try {
Naming.rebind( "hello", new HelloServer() );
} catch( RemoteException e ) { System.err.println( e ); }
catch( MalformedURLException e ) { System.err.println( e ); }
}
private String hiMsg;
}
UMBC
The Client
import java.rmi.*;
public class HelloClient {
public static void main( String[ ] args ) {
System.setSecurityManager( new RMISecurityManager() );
try {
IHello iface =
(IHello) Naming.lookup( "rmi://<host>/hello" );
System.out.println( "Client says " + iface.sayHi() );
} catch( Exception e ) { System.err.println( e ); }
}
}
25
UMBC
Connecting Client to Server
javac HelloServer.java HelloClient.java
rmic HelloServer
Rmiregistry &
java –Djava.security.policy=<policyfile> HelloServer &
java –Djava.security.policy=<policyfile> HelloClient
26
UMBC
A Policy File
grant {
// Allow everything for now
permission java.security.AllPermission;
};
27
UMBC
Client
• Defines task to be done by
ComputeEngine
28
package client;
Example
import java.rmi.*;
import java.math.*;
import compute.*;
public class ComputePi {
public static void main(String args[]) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
String name = "//" + args[0] + "/Compute";
Compute comp = (Compute) Naming.lookup(name);
Pi task = new Pi(Integer.parseInt(args[1]));
BigDecimal pi = (BigDecimal) (comp.executeTask(task));
System.out.println(pi);
} catch (Exception e) {
System.err.println("ComputePi exception: " + e.getMessage());
e.printStackTrace();
}
}
}
package client;
import compute.*;
import java.math.*;
Example
public class Pi implements Task {
// Construct a task to calc pi to the spec digits
public Pi(int digits) {
this.digits = digits;
}
// Calculate pi
public Object execute() {
return computePi(digits);
}
public static BigDecimal computePi(int digits) {
int scale = digits + 5;
BigDecimal arctan1_5 = arctan(5, scale);
BigDecimal arctan1_239 = arctan(239, scale);
BigDecimal pi = arctan1_5.multiply(FOUR).subtract(
arctan1_239).multiply(FOUR);
return pi.setScale(digits,
BigDecimal.ROUND_HALF_UP);
}
}
UMBC
Running the Example
• Pi class downloaded to server at runtime
• ComputeEngine stub downloaded to client
at runtime
• Make jar file with compute package
(interfaces)
• Distribute to developers
• Put classes in network accessible directory
31
UMBC
Using RMI
• RMI uses URL protocols to download code
• Classpath should include location of jar
files
and source files
• Compile source (javac), generate stub
(rmic)
• Source for the example discussed so far can
be found in the Java Tutorial on RMI
32
UMBC
Selected References
•
•
•
•
Advanced Techniques for Java Developers Chapter 7
http://java.sun.com/docs/books/tutorial/rmi/index.html
Exploring Java, O’Reilly, Niemeyer & Peck
Java RMI Remote Method Invocation, Troy Downing,
IDG Books
• The RMI example comes from Core Web Programming,
Marty Hall, Prentice Hall
• http://engronline.ee.memphis.edu/AdvJava/lecture
.htm
33