예제

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.1. WSDL 파일 생성

xwsdlgen 유틸리티를 이용해서 wsdl 파일을 생성한다.

xwsdlgen –m sample –g sample.xml –o sample.wsdl

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();
 }
}