Remote Method Invocation Java
Remote Method Invocation Java
Remote Method Invocation Java
Code movement
Codebase
ClassLoader delegation
RMI Security
Activation
HTTP Tunneling
2
What is RMI?
What is RMI?
RPC Evolution
Non-object-orientedRPC
CORBA (Object-oriented)
RMI (Object-based)
4
What is RMI?
5
Why RMI?
Remote interface
Stub and Skeleton
Remote object
8
Remote Interface
Java interface
Specify remotely accessible methods
Implemented by a class, an instance of
which becomes a remote object
Contract between caller of the remote
method (RMI client) and remote object
(RMI server)
Extends java.rmi.Remote interface
Markup interface
9
Stub & Skeleton
Stub and Skeleton
11
Stub and Skeleton
RMI Stub
Resides in caller’s local address space
Represents remote object to caller (client)
Plays the role of proxy of remote object
Implementation of Remote interface
Caller invokes methods of RMI Stub locally
Connects to the remote object
Sends arguments to and receive results
12
Stub and Skeleton
RMI Skeleton
Resides in server’s address space
Receives arguments from caller (RMI
object to be called
From JDK 1.3, RMI Skeleton gets created
13
Remote Object
14
RMI Communication Model
RMI Communication Model
Remote
Caller Object
Remote Interface
Skeleton
Stub
16
RMI Control Flow
17
RMI Control Flow
Caller (Client)
1. invokes a method of a remote object
Stub of the remote object
1. interceptsthe method call
2. marshals the arguments
3. makes calls to remote object
18
RMI Control Flow
Remote object
1. Receives the calls via Skeleton
2. Unmarshals the arguments
3. Performs the call locally
4. Marshals the result
5. Send the result to client
Stub
1. Receives result
2. Unmarshal result
3. Return result to client
19
Serialization in RMI
Marshaling and Unmarshaling
22
Serialization in RMI
23
Example
24
Serialization
Serialized copy of an object
Stream of bytes
Persistently maintains state of an object
State of non-static and non-transient variables
of the object
Does NOT contain class bytecodes
(*.class files)
Instead maintains information on “where to get
the class bytecodes”
– codebase annotation
– Who performs the codebase annotation?
If the class is unknown to the recipient, it will
be downloaded automatically
25
Serialization
26
Marshaled Objects
What and Why Marshaled
Objects?
Container object of serialized object
Constructed by passing object into
constructor
get() method retrieves the deserialized
object
Used when you want to maintain the
serialized object without deserializing it
immediately
Storage service of objects
Lookup service
28
Dynamic Class
Loading
Dynamic Class Loading
Class
bytecodes (Class file) get
downloaded during runtime
When caller does not have the class
bytecodes in local classpath
RMI Stub needs to be downloaded to RMI
Caller’s address space from somewhere
Serialized
copy of an object contains
“where to get class bytecodes”
information
Codebase annotation
30
Who Does Provide Codebase
Annotation Information?
By the exporter of the class
Via Export codebase (RMI codebase)
property
java.rmi.server.codebase
Typically via HTTP URL
31
When Does the Codebase
Annotation occurs?
Whenever an object gets serialized
For remote object
Codebase information of Stub class
For non-remote object
Codebase information of normal class
32
RMI Server and Client
Deployment Scenario
Both client and server have RMI Remote
interface class in their local classpaths
Server has HelloWorld_Stub class in its
local classpath
Client does not have HelloWorld_Stub
34
Code (and Data)
Movement
Code movement in Jini?
Contains
Values of the fields of the object
Name of the class
Location of the class
Via codebase annotation performed by the
exporter of the class
RMI codebase property
Codebase
What is Codebase?
40
Two types of Codebase
Import codebase
codebase your local VM uses to load
classes it needs
specified via CLASSPATH or -cp option
41
Behind the Scene Activities
Any objects marshaled by a server will
be annotated with RMI codebase
Forremote object, the stub object gets
marshaled and annotated
When a client instantiates the object,
the bytecodes of the class will be
downloaded by RMIClassloader from
the location specified as RMI
codebase
42
RMI codebase forms
43
RMI codebase
For Jini service (as an RMI server)
Export classes that are needed by its client
Stub classes for remote objects
Interface classes of remote objects
– If client has the classes in its local classpath, no
downloading occurs
Any classes that are needed by the interface and stub
classes
For Jini client
Export classes that are needed by the server
Same as above
44
RMI codebase examples
45
Jini RMI codebase examples
Lookup service
java -jar C:\files\jini1_1\lib\reggie.jar
http://daydreamer:8081/reggie-dl.jar
C:\files\jini1_1\policy\policy.all C:\tmp\reggie_log public
Lookup browser (Client)
java -cp C:\files\jini1_1\lib\jini-examples.jar
-Djava.security.policy=C:\files\jini1_1\example\browser\policy
-Djava.rmi.server.codebase=http://daydreamer:8081/jini-examples-
dl.jar com.sun.jini.example.browser.Browser
46
jini-examples-dl.jar
47
Typical Causes of Problems
The java.rmi.server.codebase (RMI codebase) property
was not set at all
Do not use “localhost”
RMI codebase was set, but HTTP server is not running
RMI codebase was set, HTTP server is running, but the
class is not present under the proper path in HTTP
server
The port number on which HTTP server is listening is not
the same as the port number in the RMI codebase
The name of the host on which HTTP server is running
is not the same as the hostname in the RMI codebase
If a non-jar URL is being used in the RMI codebase,
there is no trailing slash (if class file location is in a jar
file, no trailing slash is required)
48
Typical RMI codebase
Symptom
java.rmi.UnmarshalException: error unmarshalling
return; nested exception is:
java.lang.ClassNotFoundException:
example.testService_Stub
Client could not download the stub class
from the server
The error message could be misleading in
JDK 1.2 (Fixed in JDK 1.3)
The problem could be that the stub class itself is
downloadable but other classes that the stub needs
are not downloadable
Use “javap -classpath <path1:path2> <classname>”
49
Typical RMI codebase
Symptom
RemoteException occurred in server thread; nested
exception is:
java.rmi.UnmarshalExceptionException: error
unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException:test.TestClient$
ServiceListener_Stub
Server could not download the remote
event listener stub class from the client
See if stub was generated correctly (via RMIC)
See if listener object was exported (via
.exportObject() method)
See if RMI codebase is set correctly by the client
50
Typical RMI codebase
Symptom
Things are working fine but when
client and server are on different
machines, I get
ClassNotFoundException
Very likely due to the fact that the class
files are not available anymore
Do not use CLASSPATH for downloadable
files
– Do use RMI codebase
Do not use “localhost”
51
RMI Codebase FAQ
Should client applications include mahalo-
dl.jar or reggie-dl.jar in their CLASSPATH?
They can. But it diminishes the whole purpose
of dynamic class downloading during runtime.
It is better they get exported by specific
implementations of TxnManager and Lookup
service (I.e. Mahalo and Reggie)
The client apps need the following in their
is really missing
javap -classpath abc.jar:def.jar example.test
53
Implementation Guideline
55
Deployment Tips
56
Trouble-shooting methods
Run HTTP server in verbose mode (Example next slide)
Will display all the jar or class files being downloaded
Set “-Djava.rmi.loader.logLevel=VERBOSE” on RMI
client (Example next slide)
Will tell which class file is being downloaded from
which location
Try “javap -classpath <pathlist or jar files>
<classname>” on command line (Example next slide)
Will tell what is really missing
See if you can access the jar file using a browser
“Save as” dialog box pops up if the file is accessible
Try FTP URL notation (instead of HTTP)
If it works, HTTP has a problem
57
Running HTTP server in
verbose mode
[daydreamer] java -cp /files/jini1_0/lib/tools.jar com.sun.jini.tool.ClassServer
-port 8081 -dir /home/sang/jars -verbose
58
-Djava.rmi.loader.logLevel=VERBOSE
[daydreamer] java
-Djava.security.policy=/home/sang/src/examples/client/policyLookupSrvcAndInvoke -Dsun.rmi.loader.logLevel=VERBOSE
-jar /home/sang/jars/LookupSrvcAndInvoke.jar daydreamer
groupsWanted[0] = daydreamer
Waiting For Discovery to Complete
Wed Mar 17 07:43:01 EST 1999:loader:unicast discovery:LoaderHandler.loadClass: loading class "com.sun.jini.reggie.RegistrarProxy" from
[http://daydreamer:8080/reggie-dl.jar]
.Wed Mar 17 07:43:02 EST 1999:loader:unicast discovery:LoaderHandler.loadClass: loading class "com.sun.jini.reggie.RegistrarImpl_Stub"
from [http://daydreamer:8080/reggie-dl.jar]
LookupDiscoveryListener: discovered...
Lookup on host jini://daydreamer/:
regGroups[0] belongs to Group: myGroup
regGroups[1] belongs to Group: daydreamer
...........
Discovery of Available Lookups Complete.
Query each Lookup for known Services, the Invoke ...
Lookup Service on Host: jini://daydreamer/
Belongs to Group: daydreamer
Wed Mar 17 07:43:13 EST 1999:loader:main:LoaderHandler.loadClass: loading class "com.sun.jini.lookup.entry.BasicServiceType" from
[http://daydreamer:8080/reggie-dl.jar]
Wed Mar 17 07:43:13 EST 1999:loader:main:LoaderHandler.loadClass: loading class "net.jini.lookup.entry.ServiceInfo" from
[http://daydreamer:8080/reggie-dl.jar]
Wed Mar 17 07:43:13 EST 1999:loader:main:LoaderHandler.loadClass: loading class "com.sun.jini.lookup.entry.BasicServiceType" from
[http://daydreamer:8080/sun-util.jar, http://daydreamer:8081/RegRemoteAndProvideLease-srvc-dl.jar,
http://daydreamer:8081/RegRemoteAndProvideLease-attr-dl.jar]
Wed Mar 17 07:43:13 EST 1999:loader:main:LoaderHandler.loadClass: loading class "net.jini.lookup.entry.ServiceInfo" from
[http://daydreamer:8080/sun-util.jar, http://daydreamer:8081/RegRemoteAndProvideLease-srvc-dl.jar,
http://daydreamer:8081/RegRemoteAndProvideLease-attr-dl.jar]
59
javap
[daydreamer:291] javap -classpath LookupSrvcAndInvoke.jar examples/lease/TestLease
Class 'examples/lease/TestLease' not found
60
javap
admin/AdminServer registers with a lookup service without including
OurOwnAdmin class file in its downloadable jar
You will see unknown service on the Lookup browser
[daydreamer:230] cd ~sang/jars
[daydreamer:232] ls -lat Admin*
-rw-rw---- 1 sang jinieast 8035 Mar 22 21:19 AdminClient.jar
-rw-rw---- 1 sang jinieast 2083 Mar 21 23:44 AdminServer-attr-dl.jar
-rw-rw---- 1 sang jinieast 4953 Mar 21 23:44 AdminServer-srvc-dl.jar
-rw-rw---- 1 sang jinieast 13560 Mar 21 23:44 AdminServer.jar
[daydreamer:229] !226
javap -classpath AdminServer-srvc-dl.jar examples/admin/AdminServerImpl_Stub
Error: No binary file 'Administrable'
61
Review Points
RMI codebase
Used for exporting class files
Serialized object has codebase annotation
Set via java.rmi.server.codebase property
Cause of most of
ClassNotFoundException problems
62
ClassLoader
Delegation
ClassLoader Delegation
64
Classloader Hierarchy
Extension Classpath
Extension Classloader
Delegation
Application Classloader CLASSPATH
65
Example
Local Classpath
Interface1 Interface1
RMI Classloader
Interface1Impl_Stub
Interface2
Interface2Impl_Stub
66
RMI Security
Java Security
69
Security Policy Example: for
Reggie
grant codebase "file:${java.class.path}" {
// file system dependent permissions for unix file system
permission java.io.FilePermission "./*", "read,write,execute,delete";
permission java.io.FilePermission "/tmp", "read,write,execute,delete";
permission java.io.FilePermission "/tmp/-", "read,write,execute,delete";
permission java.io.FilePermission "/var/tmp", "read,write,execute,delete";
permission java.io.FilePermission "/var/tmp/-", "read,write,execute,delete";
// uncomment this one if you need lookup to accept file: codebases
// permission java.io.FilePermission "<<ALL FILES>>", "read";
permission java.lang.RuntimePermission "modifyThreadGroup";
permission java.lang.RuntimePermission "modifyThread";
permission java.net.SocketPermission "*:1024-", "connect,accept";
// for http: codebases
permission java.net.SocketPermission "*:80", "connect";
permission java.net.SocketPermission "224.0.1.84", "connect,accept";
permission java.net.SocketPermission "224.0.1.85", "connect,accept";
permission java.util.PropertyPermission "java.rmi.server.hostname", "read";
permission java.util.PropertyPermission "com.sun.jini.reggie.*", "read";
permission java.util.PropertyPermission "net.jini.discovery.*", "read";
permission net.jini.discovery.DiscoveryPermission "*";
// file system dependent permissions for windows file system
permission java.io.FilePermission ".\\*", "read,write,execute,delete";
permission java.io.FilePermission "c:\\temp", "read,write,execute,delete";
permission java.io.FilePermission "c:\\temp\\-", "read,write,execute,delete";
permission java.io.FilePermission "c:\\windows\\temp", "read,write,execute,delete";
permission java.io.FilePermission "c:\\windows\\temp\\-", "read,write,execute,delete";
// Deleted the rest
};
70
RMI/Jini Security
71
RMI Security
72
Writing RMI Server
Steps of Writing RMI Server
74
S1: Define Remote Interface
package corejini.appendixa;
import java.rmi.Remote;
import java.rmi.RemoteException;
76
S2: Write the implementation
Implement the remote interface
Extend one of the two remote classes
java.rmi.server.UnicastRemoteObject
java.rmi.activation.Activatable
77
S2: Server Implementation
Example
// A server object that implements the NextNumber
// remote interface
package corejini.appendixa;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.Naming;
import java.rmi.server.UnicastRemoteObject;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.net.MalformedURLException;
78
S2: Example -Continued
public class NextNumberImpl extends UnicastRemoteObject
implements NextNumber {
// Install SecurityManager
if (System.getSecurityManager() == null) {
System.setSecurityManager(
new RMISecurityManager());
}
79
S2: Example -Continued
try {
// Bind it with RMI Registry
String host = InetAddress.getLocalHost().getHostName();
String url = "rmi://" + host + "/nextNumber";
Naming.rebind(url, this);
System.out.println("Server bound to: " + url);
} catch (UnknownHostException ex) {
System.err.println("Couldn't get local host name");
System.exit(1);
} catch (RemoteException ex) {
System.err.println("Couldn't contact rmiregistry.");
System.exit(1);
} catch (MalformedURLException ex) {
System.exit(1);
}
80
S3: Implement Remote
Methods
Implement service logic within the
methods
Do not throw RemoteException
Theyare called locally (same address
space) from RMI Skeleton
81
S3: Example
// Implement remote method
public int getNextNumber(int n) {
return n+1;
}
82
S4: Write Server Class
83
S3: Example
84
Create one or more instances
of a remote object
Remote object gets exported during
instantiation process
Remote object is ready to receive
incoming RMI calls
85
Register the remote object with
RMI Registry
RMI Registry is a simple naming
service
Bootstrap mechanism
Typically is used by caller to get the
remote reference of the first remote object
Clientgets reference to remote object -
actually reference to stub object of the
remote object
86
Writing RMI Client
Steps of Writing RMI Client
Install
security manager
Get a reference to the remote object
implementation
The registry returns the Stub instance of
the remote object bound to that name
Invoke remote methods
88
Example
89
Example - Continued
if (System.getSecurityManager() == null) {
System.setSecurityManager(
new RMISecurityManager());
}
90
Example - Continued
Remote r = null;
try {
r = Naming.lookup(args[0]);
} catch (RemoteException ex) {
System.err.println("Couldn't contact registry.");
System.exit(1);
} catch (NotBoundException ex) {
System.err.println("There is no object bound to " + args[0]);
System.exit(1);
} catch (MalformedURLException ex) {
System.err.println("The string " + args[0] +
" is not a valid RMI URL");
System.exit(1);
}
91
Example - Continued
try {
if (r instanceof NextNumber) {
NextNumber nn = (NextNumber) r;
System.out.println("Next number after 1 is " +
nn.getNextNumber(1));
System.out.println("Next number after 2 is " +
nn.getNextNumber(2));
} else {
System.err.println("Uh oh, the name " +
args[0] + "isn't a NextNumber");
}
} catch (RemoteException ex) {
ex.printStackTrace();
}
92
Building, Deploying
RMI Server and Client
Build Process
Compile
Compile client and server in separate
directories
Generate Stub and Skeleton
Use RMIC
Takes fully qualified Java class name of
Implementation class
rmic corejini.appendixa.NextNumberImpl
94
Example: RMIC
C:\files\corejini\appendixa>rmic corejini.appendixa.NextNumberImpl
error: Class corejini.appendixa.NextNumberImpl not found.
C:\files\corejini\appendixa>cd \files
C:\files>rmic corejini.appendixa.NextNumberImpl
C:\files>cd corejini\appendixa
C:\files\corejini\appendixa>dir
95
Server Deployment Process
96
Server Deployment Process
97
Client Deployment Process
98
Activation
Activation
Why activatable objects?
Service could be shut down inadvertently or
intentionally
Activatable service gets restarted automatically when
system boots up or on-demand basis
Activatable service needs to be started (registered with
RMID) only once
Activation system components
RMID (Activation system daemon)
RMID log file
Persistently stores all activatable objects
Default is <Directory where RMID gets started>/log directory
Activatable services
They are run as child processes of RMID
100
Control Flow of Activation
101
Control Flow of Activation
102
RMID
As long as RMID is running and RMID
log file is persistent, a service can get
started on “as needed” basis
Methods of destroying a service
Kill RMID and remove RMID log file
Other services will be destroyed as well
Sledge hammer approach
Use com.sun.jini.admin.DestroyAdmin
interface’s destroy() method if the service
supports it
Recommended approach
103
Jini Activatable Services
104
Activation Trouble-shooting
java.rmi.activation.ActivationException:
ActivationSystem not running
Possibly DNS lookup problem
Try CTRL-\ (Solaris) and CTRL-BREAK (Win32) for stack
trace
Start RMID with
-J-Dsun.rmi.server.activation.debugExec=true
For any RMI properties you want to set for
activatable services (child processes of RMID), start
RMID with “-C-Dproperty=value”
-C-Djava.rmi.server.logCalls=true
105
RMI Tunneling
RMI Tunneling
Features
Protocol runs over HTTP protocol
Allows RMI client within a firewall to talk to an
RMI server outside of the firewall
Limitation
RMI server cannot talk back to the RMI client
Implications to Jini
No multicast discovery
Have to use Unicast
No event notification from RMI server to RMI
client
107
Review Points
Locating Remote Objects
registry
RMI RMI
client
server
109
Remote Communication
registry
RMI RMI
client RMI
server
110
Loading Classes
registry
RMI RMI
client RMI
111
Method Invocation
caller’s VM remote object’s VM
reference
dispatcher
112
RMI and Jini
RMI and Jini
114
RMI and Jini
116
Jini Value-propositions over
RMI
Client does not need to know where a
particular service is located
Client should not fail if the service is
unavailable or becomes unavailable
during execution
Client and servers should be proactive
in detecting failure conditions
117
Summary
118