Examine individual changes
This page allows you to examine the variables generated by the Edit Filter for an individual change.
Variables generated for this change
Variable | Value |
---|---|
Name of the user account (user_name ) | 'Arunava03' |
Page ID (page_id ) | 43284 |
Page namespace (page_namespace ) | 0 |
Page title without namespace (page_title ) | 'Java remote method invocation' |
Full page title (page_prefixedtitle ) | 'Java remote method invocation' |
Action (action ) | 'edit' |
Edit summary/reason (summary ) | '' |
Whether or not the edit is marked as minor (no longer in use) (minor_edit ) | true |
Old page wikitext, before the edit (old_wikitext ) | '[[Image:RMI-Stubs-Skeletons.JPG|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''' [[Application Programming Interface]] (API), or '''Java RMI''', is a [[Java (programming language)|Java]] application programming interface that performs the object-oriented equivalent of [[remote procedure call]]s (RPC).
# 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 [[Common Object Request Broker Architecture|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.
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 "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 {{Javadoc:SE|package=java.rmi|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.
[[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.<ref>Taylor, Ian J. From P2P to Web Services and Grids - Peers in a Client/Server World. Springer, 2005
</ref>
==Example==
The following classes implement a simple client-server program using RMI that displays a message.
'''<code>RmiServer </code> class'''—Listens to RMI requests and implements the interface which is used by the client to invoke remote methods.
<source lang=java>
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();
}
}
}
</source>
'''<code>RmiServerIntf </code> class'''—Defines the interface that is used by the client and implemented by the server.
<source lang=java>
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RmiServerIntf extends Remote {
public String getMessage() throws RemoteException;
}
</source>
'''<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</ref>.
<source lang=java>
import java.rmi.Naming;
import java.rmi.RemoteException;
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());
}
}
</source>
Before running this subj, we need to make 'Stub' file of interface we used. For this task we have RMI compiller - 'rmic'
*Note: we make stub file from *.class with implementation remote interface, not '*.java'*
<source lang=dos>
rmic RmiServer
</source>
'''<code>server.policy</code>'''—This file is required on the server to allow TCP/IP communication for the remote registry and for the RMI server.
<source lang=java>
grant {
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
permission java.net.SocketPermission "127.0.0.1:*", "accept";
};
</source>
The server.policy file should be used using the D switch of Java RTE, e.g.:
<source lang=dos>
java.exe -Djava.security.policy=server.policy RmiServer
</source>
'''<code>client.policy</code>'''—This file is required on the client to connect to RMI Server using TCP/IP.
<source lang=java>
grant {
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
};
</source>
'''<code>no.policy</code>'''—Also if you have any troubles with connecting, try this file for server or client.
<source lang=java>
grant {
permission java.security.AllPermission;
};
</source>
==See also==
* [[Cajo project|Cajo]]
* [[Serialization#Java|Serialization]]
* [[Jini]]
==References==
{{reflist}}
==External links==
* [http://download.oracle.com/javase/tutorial/rmi/index.html The Java RMI tutorial] - a good starting point to learn RMI. Also check the [http://java.sun.com/j2se/1.5.0/docs/guide/rmi/hello/hello-world.html Hello World in RMI]
* [http://java.sun.com/developer/onlineTraining/rmi/RMI.html the Java RMI online training] - Very good for training JavaRMI and as reference
* [http://java.sun.com/j2se/1.5.0/docs/guide/rmi/index.html The RMI page in the JDK docs]
* {{Javadoc:SE|package=java.rmi|java/rmi}} (Sun's Java API Reference for the RMI package)
* [http://forum.java.sun.com/forum.jspa?forumID=58 The RMI forum on java.sun.com]
* {{cite paper | author= Wollrath, Ann | coauthors= Riggs, Roger; Waldo, Jim
| title= A Distributed Object Model for the Java System | version= | pages= | publisher= | date= | doi= | url=http://pdos.csail.mit.edu/6.824/papers/waldo-rmi.pdf | format= PDF
| accessdate= 2009-02-11}}
[[Category:Java platform|RMI]]
[[Category:Remote procedure call]]
[[ar:تقنية استدعاء الطرائق البعادي]]
[[cs:Java remote method invocation]]
[[de:Remote Method Invocation]]
[[es:Java Remote Method Invocation]]
[[fr:Remote method invocation (Java)]]
[[ko:자바 원격 함수 호출]]
[[it:Remote Method Invocation]]
[[lt:RMI]]
[[nl:Remote method invocation]]
[[ja:Java RMI]]
[[pl:Remote Method Invocation]]
[[pt:RMI]]
[[ru:RMI]]
[[sv:Remote Method Invocation]]
[[uk:RMI]]
[[zh:Java RMI]]' |
New page wikitext, after the edit (new_wikitext ) | '[[File:[[File:http://www.tns.lcs.mit.edu/manuals/java-api-1.1beta2/guide/rmi/rmi-arch.doc.anc.gif]]]][[Image:RMI-Stubs-Skeletons.JPG|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''' [[Application Programming Interface]] (API), or '''Java RMI''', is a [[Java (programming language)|Java]] application programming interface that performs the object-oriented equivalent of [[remote procedure call]]s (RPC).
# 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 [[Common Object Request Broker Architecture|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.
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 "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 {{Javadoc:SE|package=java.rmi|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.
[[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.<ref>Taylor, Ian J. From P2P to Web Services and Grids - Peers in a Client/Server World. Springer, 2005
</ref>
==Example==
The following classes implement a simple client-server program using RMI that displays a message.
'''<code>RmiServer </code> class'''—Listens to RMI requests and implements the interface which is used by the client to invoke remote methods.
<source lang=java>
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();
}
}
}
</source>
'''<code>RmiServerIntf </code> class'''—Defines the interface that is used by the client and implemented by the server.
<source lang=java>
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RmiServerIntf extends Remote {
public String getMessage() throws RemoteException;
}
</source>
'''<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</ref>.
<source lang=java>
import java.rmi.Naming;
import java.rmi.RemoteException;
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());
}
}
</source>
Before running this subj, we need to make 'Stub' file of interface we used. For this task we have RMI compiller - 'rmic'
*Note: we make stub file from *.class with implementation remote interface, not '*.java'*
<source lang=dos>
rmic RmiServer
</source>
'''<code>server.policy</code>'''—This file is required on the server to allow TCP/IP communication for the remote registry and for the RMI server.
<source lang=java>
grant {
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
permission java.net.SocketPermission "127.0.0.1:*", "accept";
};
</source>
The server.policy file should be used using the D switch of Java RTE, e.g.:
<source lang=dos>
java.exe -Djava.security.policy=server.policy RmiServer
</source>
'''<code>client.policy</code>'''—This file is required on the client to connect to RMI Server using TCP/IP.
<source lang=java>
grant {
permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve";
};
</source>
'''<code>no.policy</code>'''—Also if you have any troubles with connecting, try this file for server or client.
<source lang=java>
grant {
permission java.security.AllPermission;
};
</source>
==See also==
* [[Cajo project|Cajo]]
* [[Serialization#Java|Serialization]]
* [[Jini]]
==References==
{{reflist}}
==External links==
* [http://download.oracle.com/javase/tutorial/rmi/index.html The Java RMI tutorial] - a good starting point to learn RMI. Also check the [http://java.sun.com/j2se/1.5.0/docs/guide/rmi/hello/hello-world.html Hello World in RMI]
* [http://java.sun.com/developer/onlineTraining/rmi/RMI.html the Java RMI online training] - Very good for training JavaRMI and as reference
* [http://java.sun.com/j2se/1.5.0/docs/guide/rmi/index.html The RMI page in the JDK docs]
* {{Javadoc:SE|package=java.rmi|java/rmi}} (Sun's Java API Reference for the RMI package)
* [http://forum.java.sun.com/forum.jspa?forumID=58 The RMI forum on java.sun.com]
* {{cite paper | author= Wollrath, Ann | coauthors= Riggs, Roger; Waldo, Jim
| title= A Distributed Object Model for the Java System | version= | pages= | publisher= | date= | doi= | url=http://pdos.csail.mit.edu/6.824/papers/waldo-rmi.pdf | format= PDF
| accessdate= 2009-02-11}}
[[Category:Java platform|RMI]]
[[Category:Remote procedure call]]
[[ar:تقنية استدعاء الطرائق البعادي]]
[[cs:Java remote method invocation]]
[[de:Remote Method Invocation]]
[[es:Java Remote Method Invocation]]
[[fr:Remote method invocation (Java)]]
[[ko:자바 원격 함수 호출]]
[[it:Remote Method Invocation]]
[[lt:RMI]]
[[nl:Remote method invocation]]
[[ja:Java RMI]]
[[pl:Remote Method Invocation]]
[[pt:RMI]]
[[ru:RMI]]
[[sv:Remote Method Invocation]]
[[uk:RMI]]
[[zh:Java RMI]]' |
Whether or not the change was made through a Tor exit node (tor_exit_node ) | 0 |
Unix timestamp of change (timestamp ) | 1323145987 |