Title: Java RMI
1Java RMI
- ICS 123
- Richard N. Taylor and Eric M. Dashofy
- UC Irvine
- http//www.isr.uci.edu/classes/ics123s02/
with the usual thanks to David Rosenblum
2What Is Java RMI?
Java RMI Java Remote Method Invocation
- A distributed interoperability technology for
Java - Packages java.rmi, java.rmi.server and
java.rmi.registry - Tools rmic and rmiregistry
- Javas 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 CORBAs common object services
- Detailed documentation is available at
- http//java.sun.com/
3Client/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.UnicastRemote
Object 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
4Client/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
5Client/Server Execution with Java RMI (I)
Client
Server
RegistryServer
Servers machine
Clients machine
6Client/Server Execution with Java RMI (II)
Client
RegistryServer
Servers machine
Clients machine
7Client/Server Execution with Java RMI (III)
Client
skeleton
Naming.rebind()
RegistryServer
Servers machine
Clients machine
8Client/Server Execution with Java RMI (IV)
Client
skeleton
stub
RegistryServer
Naming.lookup()
Servers machine
Clients machine
9Client/Server Execution with Java RMI (V)
Remote MethodInvocation
Client
skeleton
stub
RegistryServer
Servers machine
Clients machine
10Default 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
11ExampleAir 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
12Air Traffic ControlATC Exception
package 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
13Air Traffic ControlPosition Report Data
package 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/deser
ialization
14Air Traffic ControlRemote Controllers Interface
package 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
15Air Traffic ControlRemote 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)
16Air Traffic ControlRemote 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 lt -90 pos.latitude gt
90 pos.longitude lt -180
pos.longitude gt 180 pos.heading lt 1
pos.heading gt 360 pos.airspeed lt 50
pos.airspeed gt 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")
17Air Traffic ControlATC Server
package ATC import java.rmi. public class
ATCServer public static void main(String
args) try Controller c new
Controller(args0, args1) catch
(Exception ex) System.err.println("Excepti
on " ex) System.err.println("usage java
ATCServer port controllerName")
18Air Traffic ControlAirplane 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(args0)
myController args1 ControllerInterface
c // The interface, not the class!
(ControllerInterface)Naming.lookup("rmi//"
myController) c.CheckIn(myFlightNumber)
19Air Traffic ControlAirplane 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("R
emoteException " 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")
20Air Traffic ControlGNUmakefile
CLASSFILESATC/ATCException.class \
ATC/ATCServer.class \
ATC/Airplane.class \
ATC/Controller.class \
ATC/ControllerInterface.class \
ATC/PositionReport.class REMOTECLASSATC/Control
ler.class RMIFILESATC/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 lt
21Compiling the Example
elysees 1332gt ls ATC/ GNUmakefile elysees
1333gt ls ATC ATCException.java
Controller.java ATCServer.java
ControllerInterface.java Airplane.java
PositionReport.java elysees 1334gt 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.cla
ss Controller_Stub.class ATC elysees 1335gt ls
ATC ATCException.class
Controller.java ATCException.java
ControllerInterface.class ATCServer.class
ControllerInterface.java ATCServer.java
Controller_Skel.class Airplane.class
Controller_Stub.class Airplane.java
PositionReport.class Controller.class
PositionReport.java elysees 1336gt
22Running the ExampleLocal Client and Server
Server on elysees (using the default registry
port number)
elysees 1352gt rmiregistry 1 5398 elysees
1353gt java ATC.ATCServer 1099 LosAngeles 2
5407 elysees 1354gt
Client on elysees
elysees 1355gt java ATC.Airplane 100
/LosAngeles ATCException ATC.ATCException flight
100 invalid position elysees 1356gt java
ATC.Airplane 100 elysees.ics.uci.edu/LosAngeles AT
CException ATC.ATCException flight 100 invalid
position elysees 1357gt
23Running the ExampleRemote Client and Server
Server on elysees (using a non-default registry
port number)
elysees 1352gt rmiregistry 1033 1
5398 elysees 1353gt java ATC.ATCServer 1033
LosAngeles 2 5407 elysees 1354gt
Client on octavian
octavian 1356gt java ATC.Airplane 100
/LosAngeles RemoteException java.rmi.ConnectExcept
ion Connection refused to host
octavian.ics.uci.edu1099 nested exception is
java.net.ConnectException Connection
refused octavian 1357gt java ATC.Airplane 100
elysees.ics.uci.edu/LosAngeles RemoteException
java.rmi.ConnectException Connection refused to
host elysees.ics.uci.edu1099 nested
exception is java.net.ConnectException
Connection refused octavian 1358gt java
ATC.Airplane 100 elysees.ics.uci.edu1033/LosAngel
es ATCException ATC.ATCException flight 100
invalid position octavian 1359gt
24Other Possible Architectures
- A program or remote object can act as both a
client and a server - Example 3-Tiered Client/Server
ClientProgram
25Principal SimilaritiesBetween 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
26Principal 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
27Sidebar 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.cr
eateProxy(myInvocationHandler, ActionListener.clas
s) - Some detail omitted for clarity
28Why 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 - Dont 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
29Discussion
- 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?