Site Search :
Standard Enterprise XML Methodology Pattern Setting Tunning Other
Article Contributors
GuestBook
Javapattern Maven
XSourceGen Dev
JetSpeed Test
JLook Image
jLook Family Site


JRMP, IIOP type의 RMI분산 객체(RMI over IIOP)
 
JRMP, IIOP type의 RMI분산 객체(RMI over IIOP)의 개념과 샘플프로그램을 보도록 한다. ( 2003/02/28 ) 41
Written by specular - 전홍성
1 of 1
 
RMI over IIOP
    RMI over IIOP는 IBM과 Sun에 의해 개발된것으로, IIOP에 대한 새로운 RMI 버젼입니다. 초기 RMI(Remote method invocation)은 JRMP(Java Remote Method Protocol)을 사용했는데, CORBA와 interoperability를 지원하기 위해 RMI over IIOP를 제시하게 된 것입니다.

Before RMI-IIOP


Introducing RMI-IIOP

 
 
    RMI 분산객체는 JRMP, IIOP두가지 방식으로 개발 되어 질수 있습니다. java.rmi.server.UnicastRemoteObject를 extends 받아 servant class를 정의할때는 JRMP로 개발 되어 지는 것이고, javax.rmi.PortableRemoteObject를 extends받을 경우는 IIOP로 개발 되어 지는 것이다. 물론, servant class의 super class type에 의해 JRMP, IIOP가 결정된다고 이야기 할수는 없습니다. servant class가 super class없이 개발 되어지고, exportObject을 UnicastRemoteObject를 이용하면, JRMP type이고, PortableRemoteObject를 이용하면, IIOP type이 되는 것입니다.
그리고, jdk의 naming service에는 rmiregistry, tnameserv가 있는데, rmiregistry는 JRMP를 지원하고, tnameserv는 IIOP를 지원합니다.
자 그럼 다음의 단계별 코드를 보겠습니다.

    1. Remote interface 개발 : JRMP, IIOP나 remote interface 개발은 동일 합니다.
import java.rmi.*;

public interface Echo extends Remote 
{
	public String sayEcho(String name) 
		throws RemoteException;
}
    2. Servant class 개발 : JRMP type으로 개발하고자 할경우에는 java.rmi.server.UnicastRemoteObject, IIOP type으로 개발하고자 할경우에는 javax.rmi.PortableRemoteObject로 부터 상속을 받아 정의 할수 있습니다. 그러나, Dual Export(하나의 분산객체를 갖고, JRMP, IIOP 두가지 type으로 export)하기 위해 다음과 같이 정의 했습니다.
import java.rmi.*;
import javax.rmi.*;
import java.rmi.server.*;

public class EchoImpl 
	implements Echo 
{
	
	public EchoImpl() 
		throws RemoteException{ }
	
	public String sayEcho(String name) 
	{
		System.out.println(name);
		return "Hi..."+name;
	}
}
    3. Server application 개발 : 개발된 분산객체를 JRMP naming service인 rmiregistry와 IIOP naming service인 tnameserv에 각각 export함.
import java.rmi.*;
import java.rmi.server.*;
import javax.rmi.*;
import javax.naming.*;
import java.util.*;

public class Server 
{
	public static void main(String args[]) 
		throws Exception 
	{
		EchoImpl serv = new EchoImpl();
		
		String jrmpUrl="rmi://localhost:1099";
		String jrmpFactory="com.sun.jndi.rmi.registry.RegistryContextFactory";
		Hashtable jrmpEnv=new Hashtable();
		jrmpEnv.put(Context.PROVIDER_URL, jrmpUrl);
		jrmpEnv.put(Context.INITIAL_CONTEXT_FACTORY,jrmpFactory);
		Context jrmpCtx = new InitialContext(jrmpEnv);
		UnicastRemoteObject.exportObject(serv);
		jrmpCtx.rebind("MyEcho",serv);
		
		String iiopUrl="iiop://localhost:900";
		String iiopFactory="com.sun.jndi.cosnaming.CNCtxFactory";
		Hashtable iiopEnv=new Hashtable();
		iiopEnv.put(Context.PROVIDER_URL, iiopUrl);
		iiopEnv.put(Context.INITIAL_CONTEXT_FACTORY,iiopFactory);
		Context iiopCtx = new InitialContext(iiopEnv);
		PortableRemoteObject.exportObject(serv);
		iiopCtx.rebind("MyEcho",serv);
		
		System.out.println("Server is ready...");		
	}
} 	
    4. Client Application 개발 : naming service를 통해 분산객체의 remote reference를 얻어내고, remote method를 호출...
import java.rmi.*;
import javax.rmi.*;
import javax.naming.*;
import java.util.*;

public class Client 
{
	public static void main(String args[]) 
		throws Exception 
	{
		System.out.println("### to the rmiregistry : JRMP -------------------");
		String jrmpUrl="rmi://localhost:1099";
		String jrmpFactory="com.sun.jndi.rmi.registry.RegistryContextFactory";
		Hashtable jrmpEnv=new Hashtable();
		jrmpEnv.put(Context.PROVIDER_URL, jrmpUrl);
		jrmpEnv.put(Context.INITIAL_CONTEXT_FACTORY,jrmpFactory);
		Context jrmpCtx = new InitialContext(jrmpEnv);
		
		Object obj = jrmpCtx.lookup("MyEcho");
		System.out.println(obj.getClass().getName());
		Echo echo = (Echo)PortableRemoteObject.narrow(obj,Echo.class);
		System.out.println(echo.sayEcho("HongSeong"));
		
		System.out.println("### to the tnameserv : IIOP -------------------");
		String iiopUrl="iiop://localhost:900";
		String iiopFactory="com.sun.jndi.cosnaming.CNCtxFactory";
		Hashtable iiopEnv=new Hashtable();
		iiopEnv.put(Context.PROVIDER_URL, iiopUrl);
		iiopEnv.put(Context.INITIAL_CONTEXT_FACTORY,iiopFactory);
		Context iiopCtx = new InitialContext(iiopEnv);
		
		obj=iiopCtx.lookup("MyEcho");
		System.out.println(obj.getClass().getName());
		echo=(Echo)PortableRemoteObject.narrow(obj,Echo.class);
		System.out.println(echo.sayEcho("HongSeong"));
	}
}
    5. Compile
	prompt>javac *.java
    6. Stub,Skeleton 생성
	prompt>rmic EchoImpl   		==> JRMP type Stub,Skeleton 생성
	prompt>rmic -iiop EchoImpl		==> IIOP type Stub,Skeleton 생성
    ◆ 실 행
	1. Naming service start
		prompt>rmiregistry
		prompt>tnameserv
		
	2. Server App start
		prompt>java Server
		
	3. Client App start
		prompt>java Client
		### to the rmiregistry : JRMP -------------------
		EchoImpl_Stub
		Hi...HongSeong
		### to the tnameserv : IIOP -------------------
		_Echo_Stub
		Hi...HongSeong
		
   
2001.05.17 written by Jeon HongSeong
 
1
References
 
http://www.javaworld.com/javaworld/jw-12-1999/jw-12-iiop.html
Copyright ⓒ 2003 www.javapattern.info & www.jlook.com, an jLOOK co.,LTD