+ All Categories
Home > Documents > ICS 123 Java RMI ICS 123 Richard N. Taylor and Eric M. Dashofy* UC Irvine * with the usual thanks...

ICS 123 Java RMI ICS 123 Richard N. Taylor and Eric M. Dashofy* UC Irvine * with the usual thanks...

Date post: 30-Dec-2015
Category:
Upload: jeffery-briggs
View: 213 times
Download: 0 times
Share this document with a friend
29
ICS 123 Java 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
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?


Recommended