예제
Tmax 서비스인 ECHOSTRING, ECHOSDL, ECHOFDL(input과 output이 동일한 서비스)을 웹 서비스로 제공하는 방법을 순서대로 설명하고 실제로 Axis 1.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>
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();
}
}