Java remote method invocation: Difference between revisions

Content deleted Content added
Adding local short description: "Programming interface", overriding Wikidata description "application-programming interface used in Java environments"
BrainStack (talk | contribs)
Link suggestions feature: 3 links added.
 
(2 intermediate revisions by 2 users not shown)
Line 1:
{{Short description|ProgrammingJava application-programming interface}}
[[File:RMI-Stubs-Skeletons.svg|thumb|right|400px|A typical implementation model of Java-RMI using [[Class stub|stub]] and [[Distributed object communication#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 [[remote method invocation]], the object-oriented equivalent of [[remote procedure call]]s (RPC), with support for direct transfer of [[Serialization#Java|serialized]] Java classes and [[Distributed Garbage Collection|distributed garbage-collection]].
 
The original implementation depends on [[Java virtual machine|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, programmers later developed a [[Common Object Request Broker Architecture|CORBA]] version.
 
Usage of the term '''RMI''' may denote solely the programming interface or may signify both the API and JRMP, [[IIOP]], or another implementation, whereas the term [[RMI-IIOP]] (read: RMI over [[IIOP]]) specifically denotes the RMI interface delegating most of the functionality to the supporting [[CORBA]] implementation.
Line 11:
 
==Generalized code==
The programmers of the original RMI API generalized the code somewhat to support different implementations, such as a [[Hypertext Transfer Protocol|HTTP]] transport. Additionally, the ability to pass arguments "[[Call by value|by value]]" was added to CORBA in order to be compatible with the RMI interface. Still, the RMI-IIOP and JRMP implementations do not have fully identical interfaces.
 
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 security, object discovery capabilities, and other mechanisms for [[distributed object]] applications.<ref name="From P2P to Web Services and Grids 2005">{{cite book |first=Ian J |last=Taylor |title=From P2P to Web Services and Grids : Peers in a Client/Server World |series=Computer Communications and Networks |publisher=Springer-Verlag |___location=London |year=2005 |isbn=1852338695 |doi=10.1007/b138333 |url=https://archive.org/details/fromp2ptowebserv0000tayl |oclc=827073874 |url-access=registration }}{{page needed|date=September 2017}}</ref>
 
 
==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.
 
<syntaxhighlight lang=java>
Line 52 ⟶ 51:
}
 
public static void main(String args[] args) throws Exception {
System.out.println("RMI server started");
 
Line 79 ⟶ 78:
 
public class RmiClient {
public static void main(String args[] args) throws Exception {
RmiServerIntf server = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
System.out.println(server.getMessage());
Line 91 ⟶ 90:
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=Java RMI Release Notes|url=http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/relnotes.html|publisher=Oracle|access-date=9 May 2012}}</ref> or for programs that don't provide an explicit [[Port (computer networking)|port number]] (or zero) when exporting remote objects, which is required for generated stubs to be possible, as described in the [[Javadoc]] for {{Javadoc:SE|module=java.rmi|java/rmi/server|UnicastRemoteObject}}. See the comment in the constructor above.
 
==References==
Line 98 ⟶ 97:
==External links==
*{{cite web |title=Remote Method Invocation Home |url=http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136424.html |website= Oracle Technology Network for Java Developers |publisher=[[Oracle Corporation]] |___location=Redwood Shores, CA, USA |access-date=2014-07-14}}
* [httphttps://downloaddocs.oracle.com/javase/tutorial/rmi/index.html The Java RMI tutorial] - a good starting point to learn RMI. Also check the [httphttps://javadocs.sunoracle.com/j2sejavase/1.5.0/docs/guide/rmi/hello/hello-world.html Hello World in RMI (Java 5)]
* [{{Webarchive|url=https://web.archive.org/web/20120812071936/http://java.sun.com/developer/onlineTraining/rmi/RMI.html the |date=12-08-2012|title=Java RMI online training] (Java 7)|nolink=y}} - Very good for training JavaRMI and as reference
* [httphttps://docs.oracle.com/javase/78/docs/technotes/guides/rmi/index.html The RMI page in the JDK 8 docs]
* {{Javadoc:SE|package=java.rmi|module=java.rmi|java/rmi}} (Sun's Java API Reference for the RMI package)
* {{cite web | author1= Ann Wollrath | author2= Roger Riggs | author3 = Jim Waldo |author3-link=Jim Waldo
| title= A Distributed Object Model for the Java System