2011년 5월 24일 화요일

Chapter 6 Web Service Client Program

Chapter 6 Web Service Client Program


JAX-RPC 클라이언트 호출모델에 따른 종류
· 정적 스텁 호출 모델 : 정적 스텁이란 WSDL문서를 이용하여 수동으로 생성된 클래스를 말한다. 정적 스텁 호출 모델은 생성된 스텁을 이용해서 원격 프로시저 호출을 하는 모델을 말한다.
· 동적 프록시 호출 모델 : 동적 프록시란 동적으로 생성되는 프록시를 말한다. 일반적으로 프록시는 외부 인터넷과 내부 컴퓨터 간에 중개 역할을 하는 소프트웨어를 말하는데, JAX-RPC에서는 웹 서비스 시스템과 클라이언트를 서로 연결해 주는 스텁 클래스를 말한다. 따라서 동적 프록시는 동적 스텁이라고 말할 수 있다.
· 동적 호출 인터페이스 모델 : 호출 가능한 인터페이스란 뜻으로 클라이언트 측에서 원격 인터페이스명을 알지 못해도 동적으로 원격 메소드를 호출할 수 있도록 해주는 모델을 말한다. Call 객체를 이용하면 원격 프로시저명과 인자에 대한 정보만 알고 있으면 원격 프로시저를 호출할 수 있다.
Sample Web Service 확인
5장에서 작성한 샘플 웹 서비스 프로그램을 확인해 본다.
디플로이된 Context명+”/webservice” 을 하면 등록된 웹서비스의 정보를 볼 수 있다.

1. 정적 스텁 호출 모델
- 스텁 클래스를 “wscompile.bat” 라는 도구를 이용하여 생성한다. C:jwsdp-1.4jaxrpcbin(예를 들어) 디렉토리에 있다.
- config.xml 문서를 아래와 같이 만든다.(다른 이름이어도 상관없다. “C:jwsdp-1.4jaxrpcsamplesHelloWorldetc” 디렉토리에 샘플 문서가 들어있다.)
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2004 Sun Microsystems, Inc. All rights reserved.
SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-->
<configuration
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl
location="http://localhost:8080/WSHello/webservice?WSDL"
packageName="WSHello" />
</configuration>


- “wscompile -gen:client [-d 클래스 저장 위치] config.xml” 을 실행하면 문서에서 “packageName”으로 지정한 디렉토리 밑에 다음과 같은 파일이 생성된다.
User.class
UserInfoIntf.class
UserInfoIntf_getUser_RequestStruct.class
UserInfoIntf_getUser_RequestStruct_SOAPBuilder.class
UserInfoIntf_getUser_RequestStruct_SOAPSerializer.class
UserInfoIntf_getUser_ResponseStruct.class
UserInfoIntf_getUser_ResponseStruct_SOAPBuilder.class
UserInfoIntf_getUser_ResponseStruct_SOAPSerializer.class
UserInfoIntf_Stub.class
User_SOAPBuilder.class
User_SOAPSerializer.class
Webservice.class
Webservice_Impl.class
Webservice_SerializerRegistry.class


- 생성된 정적 스텁 클래스을 기반으로 클라이언트 프로그램을 작성한다.
package WSHello;
import java.rmi.RemoteException;
import javax.xml.rpc.Stub;
public class WSHelloClient {
public WSHelloClient() {
}
public static void main(String[] args) {
try {
Webservice_Impl webservice = new Webservice_Impl();
Stub stub = (Stub) webservice.getUserInfoIntfPort();
UserInfoIntf userInfo = (UserInfoIntf)stub;
User user = userInfo.getUser("후루꾸",19);
System.out.println("사용자 : "+user.getName());
System.out.println("나이 : "+user.getAge());
}
catch (RemoteException e) {
e.printStackTrace();
}
}
}


2. 동적 프록시 호출 모델
package WSHello;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.Stub;
public class WSDynamicHello {
public WSDynamicHello() {
}
public static void main(String[] args) {
/**
* 작성한 WSDL 문서를 참고하여 아래의 항목을 웹서비스에 맞게 수정한다.
*/
String WSUrl = "http://localhost:8080/WSHello/webservice?WSDL";
String Qname = "http://localhost:8888/hello/webservice/wsdl/webservice";
String serviceName = "Webservice";
String PortName = "UserInfoIntfPort";
try {
ServiceFactory servicefactory = ServiceFactory.newInstance();
URL wsdlUrl = new URL(WSUrl);
QName serviceQname = new QName(Qname,serviceName);
Service service = servicefactory.createService(wsdlUrl, serviceQname);
QName portQname = new QName (Qname,PortName);
Stub stub = (Stub) service.getPort(portQname, UserInfoIntf.class);
UserInfoIntf userInfo = (UserInfoIntf)stub;
User user = userInfo.getUser("후루꾸",19);
System.out.println("사용자 : "+user.getName());
System.out.println("나이 : "+user.getAge());
}
catch (ServiceException e) {
e.printStackTrace();
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (RemoteException e) {
e.printStackTrace();
}
}
}


3. 동적 호출 인터페이스
정적 스텁 호출 모델 및 동적 프록시 호출 모델에서는 클라이언트 응용프로그램이 원격 프로시저를 호출하기 위해서는 스텁을 원격 인터페이스로 형 변환해야 한다. 따라서 원격 인터페이스가 클라이언트 응용프로그램 작성 시 반드시 있어야 한다. 하지만 동적 호출 인터페이스는 원격 인터페이스로 형 변환 없이 Call 객체를 통해서 바로 원격 프로시저를 호출할 수 있다. 즉 웹 서비스 소비자인 클라이언트에서는 원격 인터페이스가 없어도 된다는 뜻이다. 단지 원격 프로시저명과 인자에 대한 정보만 알고 있으면 원격 프로시저를 호출 할 수 있다.
package WSHello;
import java.rmi.RemoteException;
import javax.xml.rpc.*;
import javax.xml.namespace.*;
import java.net.*;
public class WSCallHello {
public WSCallHello() {
}
public static void main(String[] args) {
/**
* 작성한 WSDL 문서를 참고하여 아래의 항목을 웹서비스에 맞게 수정한다.
*/
String WSUrl = "http://localhost:8080/WSHello/webservice?WSDL";
String Qname = "http://localhost:8888/hello/webservice/wsdl/webservice";
String serviceName = "Webservice";
String PortName = "UserInfoIntfPort";
String EndPoint = "http://localhost:8080/WSHello/webservice";
try {
ServiceFactory servicefactory = ServiceFactory.newInstance();
QName serviceQname = new QName(Qname,serviceName);
Service service = servicefactory.createService(serviceQname);
QName portQname = new QName (Qname,PortName);
Call call = service.createCall(portQname);
call.setTargetEndpointAddress(EndPoint);
call.setProperty(Call.SOAPACTION_USE_PROPERTY, new Boolean(true));
call.setProperty(Call.SOAPACTION_URI_PROPERTY, "");
call.setProperty("javax.xml.rpc.encodingstyle.namespace.uri",
"http://schemas.xmlsoap.org/soap/encoding/");
call.setOperationName(
new QName(Qname,"getUser"));
call.addParameter("String_1",
new QName("http://www.w3.org/2001/XMLSchema","string"),
ParameterMode.IN);
call.addParameter("int_2",
new QName("http://www.w3.org/2001/XMLSchema","int"),
ParameterMode.IN);
call.setReturnType(
new QName("http://localhost:8888/hello/webservice/type/webservice","User"));
Object[] params = {new String("후루꾸"), new Integer(19)};
User user = (User)call.invoke(params);
System.out.println("사용자 : "+user.getName());
System.out.println("나이 : "+user.getAge());
}
catch (ServiceException e) {
e.printStackTrace();
}
catch (RemoteException e) {
e.printStackTrace();
}
}
}

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...