Content deleted Content added
BrainStack (talk | contribs) Link suggestions feature: 3 links added. |
|||
(95 intermediate revisions by 66 users not shown) | |||
Line 1:
{{Short description|Java application-programming interface}}
[[
The '''Java Remote Method Invocation''' ('''Java RMI''') is a [[Java (programming language)|Java]] [[
▲[[Image:RMI-Stubs-Skeletons.svg|thumb|right|400px|A typical implementation model of Java-RMI using [[Class stub|stub]] and [[Class skeleton|skeleton]] objects. Java 2 SDK, Standard Edition, v1.2 removed the need for a skeleton.]]
▲The '''Java Remote Method Invocation''' ('''Java RMI''') is a [[Java (programming language)|Java]] [[Application programming interface|API]] that performs the object-oriented equivalent of [[remote procedure call]]s (RPC), with support for direct transfer of [[Serialization#Java|serialized]] Java objects and [[Distributed Garbage Collection|distributed garbage collection]].
Usage of the term '''RMI''' may denote solely the programming interface or may signify both the API and JRMP, [[
▲# 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).
The basic idea of Java RMI, the distributed garbage-collection (DGC) protocol, and much of the architecture underlying the original Sun implementation, come from the "network objects" feature of [[Modula-3]].
▲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.
==Generalized code==
The programmers of the original RMI API generalized the code somewhat to support different implementations, such as a [[
RMI functionality comes in the package {{Javadoc:SE|package=java.rmi|java/rmi|module=java.rmi}}, while most of Sun's implementation is located in the <code>sun.rmi</code> package. Note that with Java versions before Java 5.0, developers had to compile RMI stubs in a separate compilation step using <code>'''rmic'''</code>. Version 5.0 of Java and beyond no longer require this step - and static stubs have been deprecated since Java 8.
==Jini version==
[[Jini]] offers a more advanced version of RMI in Java. It functions similarly but provides more advanced
==Example==
The following classes implement a simple client-server program using RMI that displays a message.
; <code>RmiServerIntf</code> interface : defines the interface that is used by the client and implemented by the server. This extends the {{Javadoc:SE|module=java.rmi|package=java.rmi|java/rmi|Remote}} interface, which serves to identify an implementing class as one with remotely-invokable methods.
'''<code>RmiServer </code> class''' — listens to RMI requests and implements the interface which is used by the client to invoke remote methods.▼
<
import java.rmi.Remote;▼
import java.rmi.RemoteException;▼
public interface RmiServerIntf extends Remote {▼
</syntaxhighlight>
▲
import java.rmi.Naming;
import java.rmi.RemoteException;
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 {
super(0);
}
Line 44 ⟶ 51:
}
public static void main(String
System.out.println("RMI server started");
try { //special exception handler for registry creation
LocateRegistry.createRegistry(1099);
System.out.println("java RMI registry created.");
} catch (RemoteException e) {
Line 56 ⟶ 63:
//Instantiate RmiServer
RmiServer
// Bind this object instance to the name "RmiServer"
Naming.rebind("//localhost/RmiServer",
System.out.println("PeerServer bound in registry");
}
}
</syntaxhighlight>
<
▲import java.rmi.Remote;
▲import java.rmi.RemoteException;
▲public interface RmiServerIntf extends Remote {
▲ public String getMessage() throws RemoteException;
▲}
▲'''<code>RmiClient </code> 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.<ref>[http://www.javaworld.com/javaworld/jw-11-2000/jw-1110-smartproxy.html Get smart with proxies and RMI - JavaWorld]</ref>
▲<source lang=java>
import java.rmi.Naming;
public class RmiClient {
public static void main(String
RmiServerIntf
System.out.println(
}
}
</syntaxhighlight>
Before running this example, we need to make a 'stub' file
*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 runtimes,<ref>{{cite web|title=
==References==
Line 100 ⟶ 96:
==External links==
*{{cite
* [
*
* [
* {{Javadoc:SE|package=java.rmi|module=java.rmi|java/rmi}} (
* {{cite
| url=http://pdos.csail.mit.edu/6.824/papers/waldo-rmi.pdf |archive-url=https://ghostarchive.org/archive/20221010/http://pdos.csail.mit.edu/6.824/papers/waldo-rmi.pdf |archive-date=2022-10-10 |url-status=live | access-date= 2009-02-11}}
* [http://docs.oracle.com/cd/E12840_01/wls/docs103/rmi/rmi_intro.html Programming WebLogic RMI] - an introduction to RMI in Oracle Weblogic.
* [http://notes.corewebprogramming.com/student/RMI.pdf General Remote Method Invocation]
[[Category:
[[Category:Remote procedure call]]
[[Category:Articles with example Java code]]
|