J2EE Tutorial - Running RMI Example
greeter.java
import java.rmi.*;
public interface greeter extends Remote
{
String greetme(String s) throws RemoteException;
}
greeterimpl.java
import javax.rmi.PortableRemoteObject;
import javax.naming.*;
import java.rmi.*;
import java.rmi.server.*;
import greeter.*;
public class greeterimpl extends
PortableRemoteObject implements greeter
{
String s;
public static void main(String args[])
{
try
{
Context initialNamingContext = new InitialContext();
// System.setSecurityManager(new RMISecurityManager());
greeterimpl obj = new greeterimpl("sam");
initialNamingContext.rebind("sam",obj);
System.out.println("remote server ready!");
System.out.println("sam is registered & waiting for call");
}
catch(Exception e1)
{
System.out.println("error"+e1);
}
}
public greeterimpl(String a) throws RemoteException
{
s = " SUN'S RMI-IIOP(RMI-CORBA) PROGRAM WELCOMES .........";
}
public String greetme(String a) throws RemoteException
{
return s+ a;
}
}
greeterclientservlet.java
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
import greeter.*;
import greeterimpl.*;
import _greeterimpl_Tie.*;
import java.rmi.*;
import java.rmi.server.*;
import javax.rmi.PortableRemoteObject;
import javax.naming.*;
import java.util.*;
public class greeterclientservlet extends HttpServlet
{
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws
ServletException,IOException
{
response.setContentType("text/html");
PrintWriter out=response.getWriter();
try
{
String s1=request.getParameter("text1");
Hashtable hash1 = new Hashtable();
hash1.put("java.naming.factory.initial","com.sun.jndi.cosnaming.CNCtxFactory");
hash1.put("java.naming.provider.url","iiop://localhost:900");
Context context1 = new InitialContext(hash1);
greeter obj=
(greeter)PortableRemoteObject.narrow(context1.lookup("sam"),greeter.class);
String s = obj.greetme(s1);
out.println("<html>");
out.println("<body>");
out.println(s);
out.println("</body>");
out.println("</html>");
}
catch(Exception e1) { out.println("error"+e1); }
}
}
greeterclientservlet.htm
<html>
<body>
<form method=post action="http://localhost:8080/servlet/greeterclientservlet">
ENTER NAME <input type=text name="text1" size=20>
<br>
<input type=submit>
</form>
</body>
</html>
How to compile and run the RMI-IIOP program?
1) We require jndi package for running this program.
We create a folder in c:\jdk1.3\bin\rmicorba.
2) We brought jndi folder into c:\jdk1.3\bin\rmicorba.
3) cd to c:\jdk1.3\bin\rmicorba.
4) set path=c:\windows;c:\windows\command;c:\jdk1.3\bin;
5) set classpath=c:\jdk1.3\bin\rmicorba
6) create greeter.java in this folder.
7) compile greeter.java
8) create and compile greeterimpl.java
9) MOST IMPORTANT STEP.
>rmic -iiop greeterimpl
(creates corba style stub and tie class files.)
10) start tnameserv // ( this is transient name server)
>tnameserv
11) Go to another window ,set path & classpath as before.
start the server and register the remote object. (this line must be typed most carefully without break!) (continuously).
>java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
-Djava.naming.provider.url=iiop://localhost helloimpl
( -Djava means we are supplying runtime properties)
12) If every thing is done correctly , you will find the following
message in the console.
'remote server ready!'
'sam is registered and waiting for call'
13) Now compile greeterclientservlet.java
We have to set classpath=%classpath%;c:\jsdk2.0\src
14) After compiling copy all the classfiles in c:\jdk1.3\bin\rmicorba folder to
c:\tomcat\webapps\root\web-inf\classes folder
15) copy greeterclientservlet.htm to c:\tomcat\webapps\root directory.
16) Start the tomcat server as already seen.
17) type the URL as 'http://localhost:8080/greeterclientservlet.htm"
in the browser.
18) We get the form. Type your name ( say 'Thomas') and submit.
19) We will get the greeting :
" SUN'S RMI-IIOP(RMI-CORBA) PROGRAM WELCOMES ...Thomas"
20) Thus we have invoked the remote object's method in Corba style.
21) So far so good. But how about the automatic generation of IDL for non-java end? This is the best part of RMI--IIOP,
See step 9 listed above. We used the -iiop flag while invoking rmic compiler.
If we use -idl flag instead, we get the idl file automatically generated.
We can then distribute this idl file to other corba customers.
You would have noticed that , we have changed the order in which distributed order technologies in the j2ee basket were mentioned. Instaed of taking up JAVA-IDL after RMI, we took up RMI-IIOP. This way, we can easily compare RMI & RMI-IIOP.
Just to complete the picture, we will now see the JAVA-IDL version of the same program and then on to the meat of J2EE (IE) EJB.
There are 4 files as follows:
1) greeter.idl
2) greeterserver.java
3) greeterservlet.java
4) greeterservlet.htm
We begin with greeter.idl , which is the interface file written in OMG-IDL.
Let us edit this file in say, c:\idl folder.
Set path for the dos window
c:\idl>set path=c:\windows\command;c:\jdk1.3\bin
Also set classpath:
c:\idl>set classpath=c:\idl
Create greeter.idl as given below.
greeter.idl
interface greeter
{
string greetme(in string s);
};
We now use the idl compiler in jdk1.3 as follows:
c:\idl>idlj -fall greeter.idl
This command creates a number of java source files as follows:
1) greeter.java
2) _greeterImplBase.java
3) _greeterStub.java
4) greeterHelper.java
5) greeterHolder.java
6) greeterOperations.java
These files are created in the same folder as greeter.idl because we have not specified 'module' in the idl file. This is a simple method.
Now, create greeterserver.java in the same folder as follows:
greeterserver.java
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import java.io.*;
public class greeterserver
{
public static void main(String[] args)
{
try
{
ORB orb = ORB.init(args,null);
greeterservant ref = new greeterservant();
orb.connect(ref);
org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("greeter","");
NameComponent path[] = {nc};
ncRef.rebind(path,ref);
System.out.println("server ready...waiting for client");
java.lang.Object sync = new java.lang.Object();
synchronized(sync)
{
sync.wait();
}
}
catch(Exception e1)
{
System.out.println(" "+e1);
}
}//main
}//class
//-------------
class greeterservant extends _greeterImplBase
{
public String greetme(String s)
{
return "How are you....?"+s;
}
}
Compile all the java files as follows:
c:\idl>javac *.java
This compiles all the java files in the folder.
We now create the servlet file which is the client for the corba program.
greeterservlet.java
import org.omg.CORBA.*;
import org.omg.CosNaming.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class greeterservlet extends HttpServlet
{
greeter server;
public void init(ServletConfig config) throws ServletException
{
super.init(config);
try
{
ORB orb = ORB.init((String[])null,null);
org.omg.CORBA.Object objRef =
orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("greeter","");
NameComponent path[] = {nc};
server = greeterHelper.narrow(ncRef.resolve(path));
System.out.println("servlet init ok!");
} catch(Exception e1){System.out.println(""+e1);}
} //init
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType("text/html");
PrintWriter out=response.getWriter();
String a =request.getParameter("text1"); // name
System.out.println(a);
String s1=server.greetme(a);
out.println(s1);
}
} //--servlet over-----
To compile the servlet file, we should set classpath as follows:
c:\idl>set classpath=%classpath%;c:\jsdk2.0\src;
c:\idl>javac greeterservlet.java
This command compiles the servlet.
The following html file invokes the servlet.
<html>
<body>
<form method=post action="http://localhost:8080/servlet/greeterservlet">
<input type=text name='text1'>
<input type=submit>
</form>
</body>
</html>
Now, we copy greeterservlet.htm to c:\tomcat\webapps\root
Then we copy all the class files in c:\idl folder to:
c:\tomcat\webapps\root\web-inf\classes folder.
We are now ready to test our corba program.
Start Tomcat as before.
Start the browser and type the URL as:
"http://localhost:8080/greeterservlet.htm"
We get a form with a textbox. Fill up your name,say Thomas and
submit.
We will get :
"How are you...?Thomas".
We have completed the first leg of our long journey.
In the second part, we will take up EJB , XML etc. In the previous instalment , we familiarized ourselves with Servlet, JSP, JavaMail, JDBC, RMI, RMI-IIOP and IDL. as, these were preliminaries to grapple with EJB. Now , it is time to takeup EJB.
If you are facing any programming issue, such as compilation errors or not able to find the code you are looking for.
Ask your questions, our development team will try to give answers to your questions.
Ask Questions? Discuss: J2EE Tutorial - Running RMI Example View All Comments
Post your Comment