예제
Tmax 서비스인 ECHOSTRING, ECHOSDL, ECHOFDL(input과 output이 동일한 서비스)을 웹 서비스로 제공하는 방법을 순서대로 설명하고 실제로 Axis1.4를 이용해서 클라이언트를 만들어서 실행한다.
1. 서비스 생성
1.1. 서버 프로그램
ECHO 서비스들은 입력된 버퍼와 동일한 버퍼를 반환하는 서비스이다. 서버 프로그램 생성을 위해 필요한 파일은 서버 소스(sample.c), sdl 정의 파일(demo.s), fdl 정의 파일(demo.f)이다.
<sample.c>
#include <stdio.h> #include <usrinc/atmi.h> #include <usrinc/fbuf.h> #include "../sdl/demo_sdl.h" ECHOSTRING(TPSVCINFO *msg) { printf("client message : %s \n", msg->data ); tpreturn(TPSUCCESS, 0, (char *)msg->data, msg->len, 0); } ECHOSDL(TPSVCINFO *msg) { struct echo_s *rcvbuffer; struct echo_s test; struct echo_s test_s; rcvbuffer = (struct echo_s *)msg->data; printf("rcvbuffer\n"); printf("char : [%d] \n" "short : [%d] \n" "int : [%d] \n" "float: [%f] \n" "double: [%lf] \n" "string: [%s] \n", rcvbuffer->charvalue, rcvbuffer->shortvalue, rcvbuffer->intvalue, rcvbuffer->floatvalue, rcvbuffer->doublevalue, rcvbuffer->stringvalue ); tpreturn(TPSUCCESS, 0, (char *)msg->data, msg->len,0); } ECHOFDL(TPSVCINFO *msg) { fbprint((FBUF *)msg->data); tpreturn(TPSUCCESS,0,(char *)msg->data, msg->len,0); }
<demo.s>
다음은 sdl 정의 파일로 sdlc로 빌드한다.
struct echo_s{ char charvalue; short shortvalue; int intvalue; float floatvalue; double doublevalue; char stringvalue[20]; };
<demo.f>
다음은 fdl 정의 파일로 fdlc로 빌드한다.
CHARVALUE 2100 char SHORTVALUE 2101 short INTVALUE 2102 int FLOATVALUE 2104 float DOUBLEVALUE 2105 double STRINGVALUE 2106 string
2. 웹 서비스 설정
2.1. 서비스 정보 파일 생성
<sample.txt>
SERVICE name = echostring tmaxname = ECHOSTRING intype = STRING outtype = STRING REQUEST name = req type = string restriction = maxLength="19" RESPONSE name = result type = string restriction = maxLength="19" SERVICE name = echosdl tmaxname = ECHOSDL intype = STRUCT outtype = STRUCT instruct = echo_s outstruct = echo_s REQUEST name = charvalue type = char name = shortvalue type = short name = intvalue type = int name = floatvalue type = float name = doublevalue type = double name = stringvalue type = string restriction = maxLength="19" RESPONSE name = charvalue type = char name = shortvalue type = short name = intvalue type = int name = floatvalue type = float name = doublevalue type = double name = stringvalue type = string restriction = maxLength="19" SERVICE name = echofdl tmaxname = ECHOFDL intype = FDL outtype = FDL instruct = echofdlRequestFDL outstruct = echofdlResponseFDL REQUEST name = CHARVALUE type = char maxoccurs = 50 name = SHORTVALUE type = short maxoccurs = 50 name = INTVALUE type = int maxoccurs = 50 name = FLOATVALUE type = float maxoccurs = 50 name = DOUBLEVALUE type = double maxoccurs = 50 name = STRINGVALUE type = string maxoccurs = 50 RESPONSE name = CHARVALUE type = char maxoccurs = 50 name = SHORTVALUE type = short maxoccurs = 50 name = INTVALUE type = int maxoccurs = 50 name = FLOATVALUE type = float maxoccurs = 50 name = DOUBLEVALUE type = double maxoccurs = 50 name = STRINGVALUE type = string maxoccurs = 50
<sample.txt> 파일을 $TMAXDIR/config 디렉터리에 위치시키고 tmmbfgen으로 서비스 정보 바이너리 파일을 생성한다.
tmmbfgen –r sample.txt –o sample
2.2. 웹 서비스 게이트웨이 설정 파일 생성
<sample.xml>
$endpoint에 외부로 보여질 주소를 입력한다. (예 : 192.168.1.2:80 ) 파일은 $TMAXDIR/config 디렉터리에 위치시킨다.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="http://www.tmax.co.kr/twsp/twsgwconfig/">
<Servicelist id="TmaxSampleECHO" >
<Service name="echostring" />
<Service name="echosdl" />
<Service name="echofdl" />
</Servicelist>
<GWInstance>
<HTTP address="$endpoint"/>
</GWInstance>
</Configuration>
3. Tmax 환경 파일
다음은 Tmax 환경설정 파일의 예로 $NODENAME에 해당하는 머신 이름을 입력하고 $TMAXDIR에 Tmax가 설치된 디렉터리 경로를 입력한다.
*DOMAIN domain SHMKEY = 77521, MINCLH = 1, MAXCLH = 2, TPORTNO = 15000, BLOCKTIME = 30, MAXSACALL=1024, MAXCACALL=1024 *NODE $NODENAME TMAXDIR = "$TMAXDIR", APPDIR = "$TMAXDIR/appbin", PATHDIR = "$TMAXDIR/path", TLOGDIR = "$TMAXDIR/log/tlog", ULOGDIR = "$TMAXDIR/log/ulog", SLOGDIR = "$TMAXDIR/log/slog", MAXCPC=2000, MAXGWCPC=300 *SVRGROUP svg1 NODENAME = $NODENAME *SERVER sample SVGNAME = svg1 *SERVICE ECHOSTRING SVRNAME=sample ECHOSDL SVRNAME=sample ECHOFDL SVRNAME=sample *GATEWAY WSGW1 GWTYPE=WSGW, CLOPT="-csample.xml -msample", NODENAME=$NODENAME, DIRECTION=IN, PORTNO=80
4. Axis1.4 클라이언트 프로그램 생성
4.2. Stub 생성
Stub 생성을 위해서는 서버에서 생성한 <sample.wsdl> 파일이 필요하다.
다음과 같이 필요한 jar 파일을 AXIS_CLASS_PATH에 설정한다.
java –cp $AXIS_CLASS_PATH;. org.apache.axis.wsdl.WSDL2Java sample.wsdl –p echosamplesrpc
위의 명령을 실행하면 echosamplesrpc 폴더에 클라이언트를 작성할 경우 필요한 파일들이 생성된다. 이 패키지를 이용해서 아래의 클라이언트를 작성한다.
wsdl2java에 대한 자세한 사항은 apache site를 참고한다. |
<echoclient.java>
import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; public class EchoClient { public static void main(String[] args){ String url = "HTTP://192.168.1.2:80"; EchoClientWithRPC client_r = new EchoClientWithRPC(url); client_r.test(); } } class EchoClientWithRPC { private echosamplesrpc.TmaxSampleECHOLocator service; private echosamplesrpc.TmaxSampleECHOPortType port; public EchoClientWithRPC(String url) { try { service = new echosamplesrpc.TmaxSampleECHOLocator(); service.setEndpointAddress(service.getTmaxSampleECHOPortWSDDServiceName(), url); port = service.getTmaxSampleECHOPort(); } catch(ServiceException e) { e.printStackTrace(); } } private void echostring() { try { String req = "abc"; String response = port.echostring(req); System.out.println("echostring result > " + response); }catch(RemoteException e) { System.out.println(e.getMessage()); } } private void echosdl() { try { echosamplesrpc.Echo_s req = new echosamplesrpc.Echo_s(); req.setCharvalue((byte)49); req.setShortvalue((short)2); req.setIntvalue(3); req.setFloatvalue(5.1f); req.setDoublevalue(6.1); req.setStringvalue("abc"); echosamplesrpc.Echo_s response = port.echosdl(req); System.out.println("echosdl result >"); System.out.println("char value > " + response.getCharvalue() + \nshort value > "+ response.getShortvalue() + "\nint value > " + response.getIntvalue() + "\nfloat value > " + response.getFloatvalue() + "\ndouble value > " + response.getDoublevalue() + "\nstring value > " + response.getStringvalue()); }catch(RemoteException e) { e.printStackTrace(); } } private void echofdl() { try { echosamplesrpc.EchofdlRequestFDL echofdlRequestFDL = new echosamplesrpc.EchofdlRequestFDL(); echofdlRequestFDL.setCHARVALUE(new byte[]{(byte)49}); echofdlRequestFDL.setSHORTVALUE(new short[]{(short)2}); echofdlRequestFDL.setINTVALUE(new int[]{3}); echofdlRequestFDL.setFLOATVALUE(new float[]{5.1f}); echofdlRequestFDL.setDOUBLEVALUE(new double[]{6.1}); echofdlRequestFDL.setSTRINGVALUE(new String[]{"abc"}); echosamplesrpc.EchofdlResponseFDL response = port.echofdl(echofdlRequestFDL); System.out.println("echofdl result >"); System.out.println("char value > " + response.getCHARVALUE()[0] + "\nshort value > " + response.getSHORTVALUE()[0] + "\nint value > " + response.getINTVALUE()[0] + "\nfloat value > " + response.getFLOATVALUE()[0] + "\ndouble value > " + response.getDOUBLEVALUE()[0] + "\nstring value > " + response.getSTRINGVALUE()[0]); }catch(RemoteException e) { e.printStackTrace(); } } public void test() { echostring(); echosdl(); echofdl(); } }