문의하신 내용은 다음 두가지 입니다.
l Tuxedo Service의 buffer 에 memory allocation에 대한 의문사항.
l Tuxedo가 shutdown시에 client에 notify하는 방법.
1. Tuxedo buffer(carray,string,fml,view) memory allocation.
l Carray, String, View buffer를 사용할때는 tpalloc/tprealloc으로 할당된 memory를 모두 Data를 채워서 전송한다.
l fldid Length (optional) Data FML Buffer FML Header FML Data FML Data FML Data FML Data FML Field
FML Buffer의 경우는 다음 그림과 같은 구조를 가지므로 tpalloc/tprealloc으로 할당한 buffer에 FML header와 각 Field별로 header정보가 포함된다.
▷ FML Buffer 구조 ◁
l 각 field가 자신의 필드에 대한 정보를 header로써 가지고 있기 때문에 순수한 Data외의 필드 정보가 buffer의 일부분을 점유한다.
l FML Buffer는 최대 64Kbyte를 넘지 못한다. ( 16 bit )
l 64Kbyte를 넘는 데이터를 전송할때는 FML32를 사용하면 4Gbyte까지의 데이터를 전송할 수 있다.
l Client Interface Module(PowerBuilder, VB, Delphi, etc)에서 tpcall시에 Service에서 return하는 Data를 담는 buffer의 size를 어떻게 할당하도록 되어 있는냐에 따라서 FML32를 사용하더라도 64Kbyte이상 받지 못할 수 있다.
l E-mail에서 보내주신 내용중 많은 양의 Data를 보낼때 데이터를 다 받지 못하는 이유는 FML을 사용할때 계산식에서 나온 Buffer size가 64Kbyte를 넘었거나 FML의 header정보들 때문에 원하는 양의 Data가 전달되지 않는다.
l 참고로 각 필드별 header의 size는 다음과 같습니다.
Filed Type |
Size |
String |
Header 4bytes, Null 1 byte |
Carray |
Header 4bytes |
Char |
Header 2bytes, Data 2 bytes |
Short |
Header 2bytes, Data 2 bytes |
Long |
Header 2bytes, Data 4 bytes |
Float |
Header 2bytes, Data 4 bytes |
Double |
Header 2bytes, Data 8 bytes |
l 많은 양의 Data를 주고 받아야 할때는 적당한 size로 쪼개서 여러 번으로 나누어서 받는 방법을 사용하십시요.
Tuxedo System Shutdown시 Client에 알려주는 방법
l 턱시도에서 제공하는 Event Broker를 사용하여 Tuxedo System에서 발생하는 Event를 Client에서 Check할 수 있다.
l 턱시도에서 두 가지 형태의 Event Broker를 제공하는데 System에서 발생하는 event를 처리하는 TMSYSEVT(5) Event server와 사용자 정의 Event를 처리하는 TMUSREVT(5) Event Broker Server가 제공된다.
l *SERVERS TMSYSEVT SRVGRP=GROUP1 SRVID=20
Tuxedo Configuration 파일에 system event broker인 TMSYSEVT를 추가한다.
l Tuxedo Client에서는 tpinit() 시에 flags에 flags = TPU_DIP를 첨가하고, tpsetunsol를 호출하여 event handler를 설치한다. 그후 tpsubscribe를 호출하여 받고자 하는 event를 subscribe한다.
l #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include "atmi.h" #include "fml.h" #include "fml32.h" char *msg; long msglen; void msghand(char *, long, long); void (*msghptr)() = msghand; main(argc, argv) int argc; char *argv[]; { int ret, i; int done=0; long subhnd; uid_t myid; char myname[100]; char myinit[5]; char *dummy, answ[2]; TPINIT *initbuf; if ( (initbuf = ( TPINIT * ) tpalloc("TPINIT", NULL, 0) ) == ( TPINIT *) NULL ) { printf("tpalloc fail on tpinit , %d\n", tperrno); exit(1); } initbuf->flags = TPU_DIP; getpw(getuid(), myname); initbuf->usrname[3] = NULL; printf("usrname %s cltname %s\n", initbuf->usrname, initbuf->cltname); if ( tpinit(initbuf) == -1 ) { printf("tpinit fialed... %d\n", tperrno); exit(1); } (*tpsetunsol) (msghptr); if ( (subhnd = tpsubscribe("\\.Sys.*", NULL, NULL, 0 )) < 0 ) { printf("subscribe failed %s\n", tpstrerror(tperrno)); exit(1); } while (!done)
구체적인 Client Sample은 다음과 같다.
{ if ( tpchkunsol() < 0 ) { printf("tpchkunsol failed %d\n", tperrno); exit(1); } printf("sleep 5 sec...\n"); sleep(5); printf("continue y or n ?\n"); dummy = gets(answ); if ( answ[0] == 'n' || answ[0] == 'N') { done = 1; } } tpunsubscribe(subhnd, 0); tpterm(); } void msghand(char *msg, long msglen, long flags) { char workstr[200]; char btype[20], stype[20]; FBFR *transf=(FBFR *)msg; tptypes(msg, btype, stype); printf("====== < %s > entering message handler =========\n", btype); Fprint32(transf); printf("rec msg : %s \n", msg); return; }
'▶ Tuxedo > 기술자료' 카테고리의 다른 글
Tuxedo Buffer Type 비교 (0) | 2011.11.11 |
---|---|
FML과 View(STRUCTURE)의 비교 (0) | 2011.11.08 |
Application logging (0) | 2011.11.07 |
Tuxedo 운영 중 발생빈도가 높은 에러 및 조치사항 (0) | 2011.11.04 |
GP_CAT:1095: ERROR: tppost failed when posting event .SysClientState, tperrmsg=<TPEBLOCK - blocking condition found>, dropping the message (0) | 2011.11.02 |