테스트 환경
클라이언트 Oracle Linux 6.6
서버 IBM AIX 7.2
테스트 내용
client --------> AP Server1 --------> AP Server2 순서로 서비스 호출
AP Server1 서비스 함수 TOUPPER (소문자 -> 대문자 호출 서비스)
AP Server2 서비스 함수 TOLOWER (대문자 -> 소문자 호출 서비스)
로직
Client --------> AP Server1 (client) --------> AP Server2 (server)
(tpcall) (tpcall)
즉, AP Server1은 AP Server2의 클라이언트가 된다.
이 로직을 완성시키기 위해서는 AP Server1의 simpserv.c 파일을 클라이언트로 컴파일 해주어야한다.
(클라이언트의 simpcl.c 파일을 참고하여 코딩한다)
컴파일된 simpcl(Client) 실행모듈이 TOUPPER 서비스를 호출을 요청하게되면 서버로 보내지게 되고, TOUPPER 서비스를 가지고 있는 AP server인 simpserv 실행모듈은 TOUPPER 서비스를 리턴하지않고 다시 TOLOWER 서비스를 가지고 있는 AP server인 simpserv2 실행모듈이 simpserv(클라이언트)의 호출을 받아 TOLOWER 서비스를 Client에게 return하게 된다.
따라서
1. simpcl(클라이언트)이 TOUPPER 서비스를 호출하여도 return 받는 것은 TOLOWER 서비스이다.
2. simpcl(클라이언트)이 TOLOWER 서비스를 호출하여도 return 받는 것은 TOLOWER 서비스이다.
테스트 결과
# TOLOWER 호출 -> TOUPPER 리턴 -> TOLOWER 호출 -> TOLOWER 리턴
$ ./simpcl thisislowercasetotouppercase
Returned string is: thisislowercasetotouppercase
# TOUPPER 호출 -> TOUPPER 리턴 -> TOLOWER 호출 -> TOLOWER 리턴
$ ./simpcl THISISLOWERCASETOTOUPPERCASE
Returned string is: thisislowercasetotouppercase
<simpcl.c>
#include <stdio.h>
#include "atmi.h"
#if defined(__STDC__) || defined(__cplusplus)
main(int argc, char *argv[])
#else
main(argc, argv)
int argc;
char *argv[];
#endif
{
char *sendbuf, *rcvbuf;
long sendlen, rcvlen;
int ret;
if(argc != 2) {
(void) fprintf(stderr, "Usage: simpcl string\n");
exit(1);
}
if (tpinit((TPINIT *) NULL) == -1) {
(void) fprintf(stderr, "Tpinit failed\n");
exit(1);
}
sendlen = strlen(argv[1]);
if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
(void) fprintf(stderr,"Error allocating send buffer\n");
tpterm();
exit(1);
}
if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
(void) fprintf(stderr,"Error allocating receive buffer\n");
tpfree(sendbuf);
tpterm();
exit(1);
}
(void) strcpy(sendbuf, argv[1]);
ret = tpcall("TOUPPER", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);
if(ret == -1) {
(void) fprintf(stderr, "Can't send request to service TOUPPER\n");
(void) fprintf(stderr, "Tperrno = %d\n", tperrno);
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
exit(1);
}
(void) fprintf(stdout, "Returned string is: %s\n", rcvbuf);
/* Free Buffers & Detach from System/T */
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
return(0);
}
<simpserv.c>
#include <stdio.h>
#include <ctype.h>
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
{
argc = argc;
argv = argv;
userlog("Welcome to the simple server");
return(0);
}
#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOUPPER(TPSVCINFO *rqst)
#else
TOUPPER(rqst)
TPSVCINFO *rqst;
#endif
{
#변수선언
int ret;
char *sendbuf, *rcvbuf;
long sendlen, rcvlen;
#구조체연산자
sendlen = strlen(rqst->len);
if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
(void) fprintf(stderr,"Error allocating send buffer\n");
tpterm();
exit(1);
tpterm();
exit(1);
}
if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL) {
(void) fprintf(stderr,"Error allocating receive buffer\n");
tpfree(sendbuf);
tpterm();
exit(1);
}
(void) strcpy(sendbuf, rqst->data);
ret = tpcall("TOLOWER", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0);
if(ret == -1) {
(void) fprintf(stderr, "Can't send request to service TOUPPER\n");
(void) fprintf(stderr, "Tperrno = %d\n", tperrno);
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
exit(1);
}
tpreturn(TPSUCCESS, 0, rcvbuf, 0L, 0);
}
<simpserv2.c>
# vi simpserv2.c
#include <stdio.h>
#include <ctype.h>
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
"simpserv2.c" 85 lines, 2155 characters
char **argv;
#endif
{
argc = argc;
argv = argv;
userlog("Welcome to the simple server");
return(0);
}
#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOLOWER(TPSVCINFO *rqst)
#else
TOLOWER(rqst)
TPSVCINFO *rqst;
#endif
{
int i;
for(i = 0; i < rqst->len-1; i++)
rqst->data[i] = tolower(rqst->data[i]);
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOLOWER(TPSVCINFO *rqst)
#else
TOLOWER(rqst)
TPSVCINFO *rqst;
#endif
{
int i;
for(i = 0; i < rqst->len-1; i++)
rqst->data[i] = tolower(rqst->data[i]);
tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);
}
참고자료
https://mc529.tistory.com/1098?category=979773
'Middleware > Tuxedo' 카테고리의 다른 글
*RESOURCE / LDBAL (load balancing) (0) | 2022.09.20 |
---|---|
[Tuxedo] SVCTIMEOUT / 서비스타임아웃 (0) | 2022.09.20 |
[Tuxedo] 한 장비에 엔진 두개 기동 테스트 (0) | 2022.09.19 |
[Tuxedo] timeout (0) | 2022.09.19 |
Opatch 소개 / 기능 / 사용방법 (0) | 2022.09.15 |