ics 123 java rmi ics 123 richard n. taylor and eric m. dashofy* uc irvine * with the usual thanks...
TRANSCRIPT
ICS 123
Java RMI
ICS 123Richard N. Taylor and Eric M.
Dashofy*UC Irvine
http://www.isr.uci.edu/classes/ics123s02/
* with the usual thanks to David Rosenblum
ICS 123
2
Topic 14Java RMI
What Is Java RMI?
•A distributed interoperability technology for Java– Packages java.rmi, java.rmi.server and java.rmi.registry– Tools rmic and rmiregistry
• Java’s answer to CORBA– Java is the interface definition language– Key limitation: both client and server must be written in Java
•Part of Enterprise JavaBeans– Along with JDBC (Java DataBase Connectivity), Java Security, Java
Messaging Services, Java Transactions Services, Java IDL, other APIs– like CORBA’s common object services
•Detailed documentation is available athttp://java.sun.com/
Java RMI = Java Remote Method Invocation
ICS 123
3
Topic 14Java RMI
Client/Server Programming with Java RMI (I)
Define an extension of interface java.rmi.Remote– Declare the methods the remote object exports– Declare each such method to throw java.rmi.RemoteException
Define a subclass of java.rmi.server.UnicastRemoteObject that also implements the extension of java.rmi.Remote defined in step 1
Write a server program that creates an instance of the class defined in step 2
– Use synchronized wherever necessary to make server thread-safe– The server program must register the instance with a registry service– Default registry server is started by running rmiregistry
ICS 123
4
Topic 14Java RMI
Client/Server Programming with Java RMI (II)
Compile server program with javac, and then use rmic to generate stub and skeleton classes for the remote object
– Stub and skeleton take care of all networking– Limitation of rmic: the remote object class cannot be nested
Write a client program that uses the remote object
– The client uses class Naming to obtain a reference to the remote object, using the interface name from step 1 (not the class name)
– The client invokes methods on the remote object through this reference
Run the server and then run the client
ICS 123
5
Topic 14Java RMIClient/Server Execution
with Java RMI (I)
Client Server
Client’s machine Server’s machine
RegistryServer
ICS 123
6
Topic 14Java RMIClient/Server Execution
with Java RMI (II)
Client Server
RemoteObject
Client’s machine Server’s machine
RegistryServer
ICS 123
7
Topic 14Java RMIClient/Server Execution
with Java RMI (III)
Client Server
RemoteObject
Naming.rebind(…)
skeleton
Client’s machine Server’s machine
RegistryServer
ICS 123
8
Topic 14Java RMIClient/Server Execution
with Java RMI (IV)
Client Server
RemoteObject
Naming.lookup(…)
skeleton
stub
Client’s machine Server’s machine
RegistryServer
ICS 123
9
Topic 14Java RMIClient/Server Execution
with Java RMI (V)
Client Server
RemoteObject
skeleton
stub
Remote MethodInvocation
Client’s machine Server’s machine
RegistryServer
ICS 123
10
Topic 14Java RMI
Default RMI Registry
•Server on machine.com registers object with local RMI registry using some string name
Naming.rebind(“remoteObj”, referenceToRemoteObj)
•Client refers to objects with URL– Local client: rmi:///remoteObj– Remote client: rmi://machine.com/remoteObj– If client code contains
Naming.lookup(“rmi://” + objName)» objName would be “/remoteObj” for local object» objName would be “machine.com/remoteObj” for remote
object
•Registry is bound to port 1099 by default– Accepts optional port number as argument– Non-default port number must then be added to URL
ICS 123
11
Topic 14Java RMIExample:
Air Traffic Control
•Air traffic control is divided into several sectors
•Each sector is managed by a different controller
•Airplanes check in with a controller and then periodically send the controller position reports
•The controller analyzes position reports and tells an airplane when its position is too close to other planes
ICS 123
12
Topic 14Java RMIAir Traffic Control:
ATC Exceptionpackage ATC;
public class ATCException extends Exception { public ATCException(String msg) { super(msg); }}
• For server-specific exceptions
• Different from RemoteException, which is thrown as a result of RMI failure
ICS 123
13
Topic 14Java RMIAir Traffic Control:
Position Report Datapackage ATC;
public class PositionReport implements java.io.Serializable { public int Latitude; public int Longitude; public int Heading; public int Airspeed;
public PositionReport(int la, int lo, int h, int a) { Latitude = la; Longitude = lo; Heading = h; Airspeed = a; }}
• Java objects can be passed in RMIs, as long as they are serializable
– Usually accomplished with an implementation of (empty) interface Serializable– Stub and skeleton take care of serialization/deserialization
ICS 123
14
Topic 14Java RMI
Air Traffic Control:Remote Controller’s Interfacepackage ATC;
import java.rmi.*;
public interface ControllerInterface extends Remote { public void CheckIn(int flight) throws RemoteException;
public void CurrentPosition(int flight, PositionReport pos) throws RemoteException, ATCException;}
ICS 123
15
Topic 14Java RMI
Air Traffic Control:Remote Controller Class (I)package ATC;
import java.net.*; // for InetAddressimport java.rmi.*;import java.rmi.server.*;
public class Controller extends UnicastRemoteObject implements ControllerInterface { protected String myName;
public Controller(String port, String name) throws RemoteException { super(); try { myName = "//" + InetAddress.getLocalHost().getHostName() + ":" + port + "/" + name; Naming.rebind(myName, this); } catch (Exception ex) { System.err.println("Exception " + ex); } }
…}
ICS 123
16
Topic 14Java RMI
Air Traffic Control:Remote Controller Class (II)public class Controller extends UnicastRemoteObject implements ControllerInterface { …
public void CheckIn(int flight) throws RemoteException { record existence of new flight }
public void CurrentPosition(int flight, PositionReport pos) throws RemoteException, ATCException { if (pos.latitude < -90 || pos.latitude > 90 || pos.longitude < -180 || pos.longitude > 180 || pos.heading < 1 || pos.heading > 360 || pos.airspeed < 50 || pos.airspeed > 700) throw new ATCException("flight " + String.valueOf(flight) + ": invalid position"); else if ( flight is too close to other airplanes ) throw new ATCException("flight " + String.valueOf(flight) + ": dangerous position"); }}
ICS 123
17
Topic 14Java RMIAir Traffic Control:
ATC Serverpackage ATC;
import java.rmi.*;
public class ATCServer { public static void main(String[] args) { try { Controller c = new Controller(args[0], args[1]); } catch (Exception ex) { System.err.println("Exception " + ex); System.err.println("usage: java ATCServer port# controllerName"); } }}
ICS 123
18
Topic 14Java RMIAir Traffic Control:
Airplane Client (I)package ATC;
import java.rmi.*;
public class Airplane { protected int myFlightNumber; protected String myController; protected PositionReport myPosition = new PositionReport(34, -118, 180, 350);
public static void main(String[] args) { try { myFlightNumber = Integer.parseInt(args[0]); myController = args[1]; ControllerInterface c = // The interface, not the class! (ControllerInterface)Naming.lookup("rmi://" + myController); c.CheckIn(myFlightNumber); … } … } }
ICS 123
19
Topic 14Java RMIAir Traffic Control:
Airplane Client (II)public class Airplane { … public static void main(String[] args) { try { … for (;;) { c.CurrentPosition(myFlightNumber, myPosition); java.lang.Thread.sleep(200); update position } } catch (RemoteException ex) { System.err.println("RemoteException " + ex); } catch (ATCException ex) { System.err.println("ATCException " + ex); } catch (Exception ex) { System.err.println("Exception " + ex); System.err.println("usage: java Airplane flight# controllerName"); } }}
ICS 123
20
Topic 14Java RMIAir Traffic Control:
GNUmakefileCLASSFILES=ATC/ATCException.class \ ATC/ATCServer.class \ ATC/Airplane.class \ ATC/Controller.class \ ATC/ControllerInterface.class \ ATC/PositionReport.class REMOTECLASS=ATC/Controller.class RMIFILES=ATC/Controller_Skel.class \ ATC/Controller_Stub.class .SUFFIXES: .java .class all: $(CLASSFILES) $(RMIFILES) $(RMIFILES) : $(REMOTECLASS) rmic ATC.Controller mv -f *.class ATC .java.class : javac $<
ICS 123
21
Topic 14Java RMI
Compiling the Exampleelysees 1332> lsATC/ GNUmakefileelysees 1333> ls ATCATCException.java Controller.javaATCServer.java ControllerInterface.javaAirplane.java PositionReport.javaelysees 1334> gmake all+elysees+ javac ATC/ATCException.java+elysees+ javac ATC/ATCServer.java+elysees+ javac ATC/Airplane.java+elysees+ rmic ATC.Controller+elysees+ mv -f Controller_Skel.class Controller_Stub.class ATCelysees 1335> ls ATCATCException.class Controller.javaATCException.java ControllerInterface.classATCServer.class ControllerInterface.javaATCServer.java Controller_Skel.classAirplane.class Controller_Stub.classAirplane.java PositionReport.classController.class PositionReport.javaelysees 1336>
ICS 123
22
Topic 14Java RMIRunning the Example:
Local Client and ServerServer on elysees (using the default registry port number):
Client on elysees:
elysees 1355> java ATC.Airplane 100 /LosAngelesATCException ATC.ATCException: flight 100: invalid positionelysees 1356> java ATC.Airplane 100 elysees.ics.uci.edu/LosAngelesATCException ATC.ATCException: flight 100: invalid positionelysees 1357>
elysees 1352> rmiregistry &[1] 5398elysees 1353> java ATC.ATCServer 1099 LosAngeles &[2] 5407elysees 1354>
ICS 123
23
Topic 14Java RMIRunning the Example:
Remote Client and ServerServer on elysees (using a non-default registry port number):
Client on octavian:octavian 1356> java ATC.Airplane 100 /LosAngelesRemoteException java.rmi.ConnectException: Connection refused to host: [octavian.ics.uci.edu:1099]; nested exception is: java.net.ConnectException: Connection refusedoctavian 1357> java ATC.Airplane 100 elysees.ics.uci.edu/LosAngelesRemoteException java.rmi.ConnectException: Connection refused to host: [elysees.ics.uci.edu:1099]; nested exception is: java.net.ConnectException: Connection refusedoctavian 1358> java ATC.Airplane 100 elysees.ics.uci.edu:1033/LosAngelesATCException ATC.ATCException: flight 100: invalid positionoctavian 1359>
elysees 1352> rmiregistry 1033 &[1] 5398elysees 1353> java ATC.ATCServer 1033 LosAngeles &[2] 5407elysees 1354>
ICS 123
24
Topic 14Java RMIOther Possible
Architectures
•A program or remote object can act as both a client and a server
•Example: 3-Tiered Client/Server
ClientProgram
LegacyProgram
RemoteData
ObjectRemote
DataObject
ServerProgram
RemoteBusinessObject
RemoteBusinessObject
ICS 123
25
Topic 14Java RMIPrincipal Similarities
Between CORBA and RMI
•Suitable for distributed, object-oriented, client/server systems
•Synchronous interaction via remote procedure call (RPC)
•RPC implemented via client stubs and server skeletons, which hide networking and data representation
•Objects can be both client and server
ICS 123
26
Topic 14Java RMIPrincipal Differences
Between CORBA and RMI
•CORBA– Independent of implementation language– Operation invocations can be formed statically or dynamically– Object implementation binding can be static or dynamic– The CORBA object adapters define various object execution
semantics– Many integrated object services are available
•RMI– Requires objects to be programmed in Java– Objects are platform independent– Operation invocations are formed statically– Mapping of names to objects is static– Many object services are being defined within Enterprise
JavaBeans– Mobile code support
ICS 123
27
Topic 14Java RMISidebar Discussion:
Dynamic Proxies in Java
• Introduced in J2SEv1.3 (JDK1.3)•Created using the java.lang.reflect.Proxy class•Allows dynamic creation of objects that
implement an arbitrary interface class without writing code
•All methods are called through a single invoke() method, which you implement:
– public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
•You can get a proxy with a call like this:– ActionListener listener =
(ActionListener)Proxy.createProxy(myInvocationHandler, ActionListener.class);
» Some detail omitted for clarity
ICS 123
28
Topic 14Java RMIWhy are Dynamic Proxies
useful?
•A generic “listener” for Java events– Consider a generic debugging framework for Swing events
that can print every event to the screen» Don’t need to create a new implementation for each type
of listener (ActionListener, WindowListener, MouseListener, etc.)
•Dynamically create stubs for an RMI-like middleware
– This is implemented in a middleware called LJM (Lightweight Java Middleware), which ships with ArchStudio 3
– LJM allows you to do basically what RMI does except without having to use rmic
– LJM does not currently support mobile code aspects of RMI
ICS 123
29
Topic 14Java RMI
Discussion
•How would we extend the example to allow a Controller to give an Airplane instructions for avoiding a dangerous position?
•How would we extend the example to allow the Controller to indicate an ATC exception condition outside of a call to CurrentReport()?
•How would we extend the example to allow the Controller to tell the Airplane to check in with a different Controller?