Java remote method invocation
![]() |
This article relies largely or entirely upon a single source. (February 2012) |
The Java Remote Method Invocation Application Programming Interface (API), or Java RMI, is a Java API that performs the object-oriented equivalent of remote procedure calls (RPC), with support for direct transfer of serialized Java objects and distributed garbage collection.
- The original implementation depends on Java Virtual Machine (JVM) class representation mechanisms and it thus only supports making calls from one JVM to another. The protocol underlying this Java-only implementation is known as Java Remote Method Protocol (JRMP).
- In order to support code running in a non-JVM context, a CORBA version was later developed.
Usage of the term RMI may denote solely the programming interface or may signify both the API and JRMP, whereas the term RMI-IIOP (read: RMI over IIOP) denotes the RMI interface delegating most of the functionality to the supporting CORBA implementation.
Contents |
Generalized code [edit]
The programmers of the original RMI API generalized the code somewhat to support different implementations, such as a HTTP transport. Additionally, the ability to pass arguments "by value" was added to CORBA in order to support the RMI interface. Still, the RMI-IIOP and JRMP implementations do not have fully identical interfaces.
RMI functionality comes in the package java.rmi
, while most of Sun's implementation is located in the sun.rmi
package. Note that with Java versions before Java 5.0 developers had to compile RMI stubs in a separate compilation step using rmic
. Version 5.0 of Java and beyond no longer require this step.
Jini version [edit]
Jini offers a more advanced version of RMI in Java. It functions similarly but provides more advanced searching capabilities and mechanisms for distributed object applications.[1]
Example [edit]
The following classes implement a simple client-server program using RMI that displays a message.
RmiServer
class — listens to RMI requests and implements the interface which is used by the client to invoke remote methods.
import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject; import java.rmi.registry.*; public class RmiServer extends UnicastRemoteObject implements RmiServerIntf { public static final String MESSAGE = "Hello world"; public RmiServer() throws RemoteException { } public String getMessage() { return MESSAGE; } public static void main(String args[]) { System.out.println("RMI server started"); // Create and install a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); System.out.println("Security manager installed."); } else { System.out.println("Security manager already exists."); } try { //special exception handler for registry creation LocateRegistry.createRegistry(1099); System.out.println("java RMI registry created."); } catch (RemoteException e) { //do nothing, error means registry already exists System.out.println("java RMI registry already exists."); } try { //Instantiate RmiServer RmiServer obj = new RmiServer(); // Bind this object instance to the name "RmiServer" Naming.rebind("//localhost/RmiServer", obj); System.out.println("PeerServer bound in registry"); } catch (Exception e) { System.err.println("RMI server exception:" + e); e.printStackTrace(); } } }
RmiServerIntf
interface — defines the interface that is used by the client and implemented by the server.
import java.rmi.Remote; import java.rmi.RemoteException; public interface RmiServerIntf extends Remote { public String getMessage() throws RemoteException; }
RmiClient
class — this is the client which gets the reference (a proxy) to the remote object living on the server and invokes its method to get a message. If the server object implemented java.io.Serializable instead of java.rmi.Remote, it would be serialized and passed to the client as a value.[2]
import java.rmi.Naming; import java.rmi.RMISecurityManager; public class RmiClient { // "obj" is the reference of the remote object RmiServerIntf obj = null; public String getMessage() { try { obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer"); return obj.getMessage(); } catch (Exception e) { System.err.println("RmiClient exception: " + e); e.printStackTrace(); return e.getMessage(); } } public static void main(String args[]) { // Create and install a security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } RmiClient cli = new RmiClient(); System.out.println(cli.getMessage()); } }
Before running this example, we need to make a 'stub' file of the interface we used. For this task we have the RMI compiller - 'rmic'
- Note: we make a stub file from the '*.class' file with the implementation of the remote interface, not from the '*.java' file.
rmic RmiServer
Note that since version 5.0 of J2SE support for dynamically generated stub files has been added, and rmic is only provided for backwards compatibility with earlier run times.[3]
server.policy
— this file is required on the server to allow TCP/IP communication for the remote registry and for the RMI server.
grant { permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve"; permission java.net.SocketPermission "127.0.0.1:*", "accept"; };
The server.policy file should be used using the D switch of Java RTE, e.g.:
java -Djava.security.policy=server.policy RmiServer
client.policy
— this file is required on the client to connect to RMI Server using TCP/IP.
grant { permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve"; };
no.policy
— also if you have any troubles with connecting, try this file for server or client.
grant { permission java.security.AllPermission; };
References [edit]
- ^ Taylor, Ian J. From P2P to Web Services and Grids - Peers in a Client/Server World. Springer, 2005
- ^ Get smart with proxies and RMI - JavaWorld
- ^ "Jave RMI Release Notes". Oracle. Retrieved 9 May 2012.
External links [edit]
- [1] - Remote Method Invocation Home
- The Java RMI tutorial - a good starting point to learn RMI. Also check the Hello World in RMI
- the Java RMI online training - Very good for training JavaRMI and as reference
- The RMI page in the JDK docs
java.rmi
(Sun's Java API Reference for the RMI package)- Wollrath, Ann; Riggs, Roger; Waldo, Jim. A Distributed Object Model for the Java System (PDF). Retrieved 2009-02-11.
- Programming WebLogic RMI - an introduction to RMI in Oracle Weblogic.
- General Remote Method Invocation
- RMI - Servlet Integration