68
Tmax Programming Guide (RQ) Tmax v5.0 SP1 Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

Tmax

Programming Guide (RQ)

Tmax v5.0 SP1

Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

Page 2: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

Copyright Notice

Copyright © 2009 TmaxSoft Co., Ltd. All Rights Reserved.

대한민국 경기도 성남시 분당구 서현동 263 분당스퀘어(AK프라자) 12층

Restricted Rights Legend

All TmaxSoft Software (Tmax®) and documents are protected by copyright laws and the Protection Act of Com

puter Programs, and international convention. TmaxSoft software and documents are made available under the

terms of the TmaxSoft License Agreement and may only be used or copied in accordance with the terms of this

agreement. No part of this document may be transmitted, copied, deployed, or reproduced in any form or by any

means, electronic, mechanical, or optical, without the prior written consent of TmaxSoft Co., Ltd.

이 소프트웨어(Tmax®) 사용설명서의 내용과 프로그램은 저작권법, 컴퓨터프로그램보호법 및 국제 조약에 의해

서 보호받고 있습니다. 사용설명서의 내용과 여기에 설명된 프로그램은 TmaxSoft Co., Ltd.와의 사용권 계약 하에

서만 사용이 가능하며, 사용권 계약을 준수하는 경우에만 사용 또는 복제할 수 있습니다. 이 사용설명서의 전부 또

는 일부분을 TmaxSoft의 사전 서면 동의 없이 전자, 기계, 녹음 등의 수단을 사용하여 전송, 복제, 배포, 2차적 저

작물작성 등의 행위를 하여서는 안 됩니다.

Trademarks

Tmax®, Tmax WebtoB® and JEUS® are registered trademark of TmaxSoft Co., Ltd. Other products, titles or

services may be registered trademarks of their respective companies.

Tmax®, Tmax WebtoB® 와 JEUS®는 TmaxSoft Co., Ltd.의 등록 상표입니다. 기타 모든 제품들과 회사 이름은 각

각 해당 소유주의 상표로서 참조용으로만 사용됩니다.

Open Source Software Notice

This product includes various open source software that has been developed and/or licensed by “OpenSSL”, “RSA

Data Security, Inc.”, “Apache Foundation”, or “Jean-loup Gailly and Mark Adler.” TmaxSoft fully respects the

aforementioned parties and the open source software used in this product. More details can be found within the

directory “${INSTALL_PATH}/license/oss_licenses”

본 제품은 “OpenSSL”, “RSA Data Security, Inc.”, “Apache Foundation” 및 “Jean-loup Gailly와 Mark Adler”에 의

해 개발 또는 라이선스된 오픈 소스 소프트웨어를 포함합니다. 오픈 소스 소프트웨어와 개발자에 대해 경의를 표

합니다. 관련 상세 정보는 제품의 디렉터리 “${INSTALL_PATH}/license/oss_licenses”에 기재된 사항을 참고해 주

십시오.

안내서 정보

안내서 제목: Tmax Programming Guide (RQ)

발행일: 2009-08-10

소프트웨어 버전: Tmax v5.0 SP1

안내서 버전: v2.1.1

Page 3: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

내용 목차

안내서에 대하여 .......................................................................................................................... vii

제1장 소개 ................................................................................................................................. 1

1.1. 개요 ............................................................................................................................ 1

1.2. 구조 ............................................................................................................................ 1

1.3. 시스템 구성 ................................................................................................................. 2

1.3.1. RQ 파일 시스템 ................................................................................................. 2

1.3.2. RQS ................................................................................................................. 2

1.4. 시스템 운영의 개요 ....................................................................................................... 3

1.5. 복구 작업 ..................................................................................................................... 5

제2장 사용 및 관리 ...................................................................................................................... 7

2.1. 환경설정 ...................................................................................................................... 7

2.1.1. SVRGROUP ..................................................................................................... 7

2.1.2. RQ ................................................................................................................... 8

2.1.3. Tmax 환경파일 예제 ........................................................................................ 10

2.2. 시스템 관리 ................................................................................................................ 11

2.2.1. 시동 및 종료 .................................................................................................... 11

2.2.2. 상태 정보 관리 ................................................................................................. 12

제3장 API ................................................................................................................................. 15

3.1. tpenq ......................................................................................................................... 16

3.2. tpdeq ......................................................................................................................... 19

3.3. tpreissue .................................................................................................................... 21

3.4. tpextsvcname ............................................................................................................. 22

3.5. tpextsvcinfo ................................................................................................................ 24

3.6. tpqstat ....................................................................................................................... 25

3.7. tpqsvcstat .................................................................................................................. 28

3.8. tpenq_ctl .................................................................................................................... 29

3.9. tpdeq_ctl .................................................................................................................... 34

제4장 예제 ................................................................................................................................ 39

4.1. 기본 ........................................................................................................................... 39

4.1.1. 기본적인 작동 .................................................................................................. 39

4.1.2. RQ 트랜잭션 ................................................................................................... 42

4.2. 응용 ........................................................................................................................... 43

4.2.1. UCS를 사용한 RQ ........................................................................................... 43

4.2.2. Fail 큐 복구 ..................................................................................................... 46

Appendix A. 헤더파일 .............................................................................................................. 51

A.1. tmaxapi.h .................................................................................................................. 51

Tmax iii

Page 4: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에
Page 5: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

그림 목차

[그림 1.1] RQ 구조 ...................................................................................................................... 1

[그림 1.2] RQ 흐름도 ................................................................................................................... 3

[그림 1.3] 시스템 Fail의 RQ ......................................................................................................... 5

[그림 2.1] tmboot -T .................................................................................................................. 11

[그림 2.2] tmboot -q ................................................................................................................... 11

[그림 2.3] tmdown -q ................................................................................................................. 11

[그림 2.4] rqs -l, -s ..................................................................................................................... 12

[그림 2.5] rqs -f ......................................................................................................................... 13

[그림 4.1] tpenq를 서비스 명으로 호출 ........................................................................................ 40

[그림 4.2] tpenq를 NULL로 호출 ................................................................................................. 43

[그림 4.3] Fail 큐 복구 ................................................................................................................ 47

Tmax v

Page 6: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에
Page 7: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

안내서에 대하여

안내서의 대상

본 안내서는 Tmax®(이하 Tmax)의 RQ(Reliable Queue)에 대한 개념과 사용법에 대해 기술한 안내서로

Tmax RQ를 사용하여 개발하는 개발자를 대상으로 한다.

안내서의 전제 조건

본 안내서는 Tmax 시스템에 대한 전반적인 이해와 Tmax 시스템이 제공하는 각종 기능 및 특성에 대한 습

득을 위한 기본서이다.

본 안내서를 원활하게 이해하기 위해서는 다음과 같은 사항을 미리 알고 있어야 한다.

● 미들웨어(Middleware) 및 UNIX 시스템에 대한 이해

● Tmax의 기본 개념 이해

● Java , C 프로그래밍의 이해

안내서의 제한 조건

본 안내서를 읽기 전에 Tmax의 기본 개념을 숙지하고 있어야 한다. 실무에서의 구체적인 사용방법이나

관리 및 운용에 관한 사항은 각 제품의 안내서를 참고한다.

참고

Tmax 시스템 개발에 대한 기본적인 내용은 "Tmax Administration Guide"나 "Tmax Application Devel

oment Guide"를 참고한다. Tmax에서 제공하는 명령어와 C API에 대한 설명은 “Tmax Reference

Guide”를 참고한다.

안내서에 대하여 vii

Page 8: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

안내서 구성

Tmax Programming Guide (RQ)는 총 4개의 장과 Appendix로 구성되어 있다.

각 장의 주요 내용은 다음과 같다.

● 제1장: 소개

RQ 시스템의 개요 및 구조를 기술한다.

● 제2장: 사용 및 관리

RQ 시스템을 애플리케이션 개발에 적용하기 위해서 Tmax 환경 파일에 RQ를 설정하는 과정과 프로그

램 개발 과정에 대해 기술한다. 또한 RQ 시스템을 시동/종료하는 방법에 대해 기술한다.

● 제3장: API

RQ 시스템 구성에 대한 설명과 실제 애플리케이션 개발을 위한 API의 사용법에 대해서 기술한다.

● 제4장: 예제

RQ 시스템을 사용하는 기본 예제와 응용 예제에 대해 기술한다.

● Appendix A.: 헤더파일

RQ API들의 원형과 시스템 변수를 선언한 헤더파일의 내용을 예시를 통해 기술한다.

viii Tmax Programming Guide (RQ)

Page 9: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

안내서 규약

의미표기

프로그램 소스 코드의 파일명<AaBbCc123>

Ctrl과 C를 동시에 누름<Ctrl>+C

GUI의 버튼 또는 메뉴 이름[Button]

강조진하게

다른 관련 안내서 또는 안내서 내의 다른 장 및 절 언급" "(따옴표)

화면 UI에서 입력 항목에 대한 설명'입력항목'

메일계정, 웹 사이트하이퍼링크

메뉴의 진행 순서>

하위 디렉터리 또는 파일 있음+----

하위 디렉터리 또는 파일 없음|----

참고 또는 주의사항참고

그림 이름[그림 1.1]

표 이름[표 1.1]

명령어, 명령어 수행 후 화면에 출력된 결과물, 예제코드AaBbCc123

옵션 인수 값[ ]

선택 인수 값|

안내서에 대하여 ix

Page 10: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

시스템 사용 환경

요구 사항

IBM AIX 5.xPlatform

HP-UX 11.xx

Solaris 7~9 (SunOS 5.7~5.9)

최소 120MB 하드디스크 공간Hardware

256MB 이상 메모리 공간

1GB 이상 하드디스크와 512MB 이상 메모리 공간 권장

Oracle 9i 또는 10gDatabase

x Tmax Programming Guide (RQ)

Page 11: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

관련 안내서

설명안내서

Tmax를 이용하기 위한 환경설정을 하는 방법과 시스템 운영방식을

기술한 안내서이다.

Tmax

Administration Guide

Tmax 애플리케이션 프로그램 개발에 사용하는 클라이언트와 서버

의 연결, 통신에서 사용하는 함수에 대한 사용 방법과 예제를 기술한

안내서이다.

Tmax

Reference Guide

안내서에 대하여 xi

Page 12: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

연락처

Korea

TmaxSoft Co., Ltd

263 BundangSquare (AK Plaza) 12th floor, Seohyeon-dong, Bundang-gu,

Seongnam-si, Gyeonggi-do, 463-824

South Korea

Tel: +82-31-8018-1000

Fax: +82-31-8018-1115

Email: [email protected]

Web (Korean): http://www.tmax.co.kr

기술지원: http://technet.tmaxsoft.com

USA

TmaxSoft, Inc.

560 Sylvan Avenue Englewood Cliffs, NJ 07632

U.S.A

Tel: 1-201-567-8266

Fax: 1-201-567-7339

Email: [email protected]

Web (English): http://www.tmaxsoft.com

Japan

TmaxSoft Japan Co., Ltd.

5F Sanko Bldg, 3-12-16 Mita, Minato-Ku, Tokyo, 108-0073

Japan

Tel: +81-3-5765-2550

Fax: +81-3-5765-2567

Email: [email protected]

Web (Japanese): http://www.tmaxsoft.co.jp

xii Tmax Programming Guide (RQ)

Page 13: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

China

TmaxSoft China Co., Ltd.

Beijing Silver Tower, RM 1508, 2# North Rd Dong San Huan,

Chaoyang District, Beijing, China, 100027

China

Tel: +86-10-6410-6145~8

Fax: +86-10-6410-6144

Email: [email protected]

Web (Chinese): http://www.tmaxsoft.com.cn

ASEAN Office

TmaxSoft Pte. Ltd.

30 Cecil Street, Level 15 Unit 05 Prudential Tower, Singapore 049712

Singapore

Tel: +65-6232-2889

Fax: +65-6232-2919

Email: [email protected]

Web (English): http://asean.tmaxsoft.com

안내서에 대하여 xiii

Page 14: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에
Page 15: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

제1장 소개

Tmax RQ(Reliable Queue) 시스템은 클라이언트가 보낸 서비스 요청 메시지나 서비스 수행결과를 물리

적 매체(디스크) 혹은 가상 매체(메모리)에 기록하거나 읽어들이고 이를 운용/관리하는 모든 API와 명령

어를 포함한다. RQ를 사용함으로써 만일의 사태에도 사용자의 서비스 요청 및 서비스 수행 결과를 잃어

버리지 않으며 미처리된 작업도 재개할 수 있다.

1.1. 개요클라이언트의 서비스 요구가 집중되어 요구된 서비스를 즉시 처리하지 못하고 내부 큐에 적재된 상태에

서 시스템의 장애나 에러로 인하여 시스템이 비정상적으로 종료되는 경우, 모든 서비스 데이터는 삭제된

다. 이러한 경우 신뢰성이 보장되어야 하는 서비스는 정상적인 업무가 이루어질 수 없다.

이러한 문제점을 보완하기 위하여 Tmax 시스템은 대외 기관과의 연동 업무같이 신뢰성이 보장되어야 하

며 업무의 특성상 거래 시간이 일반적인 온라인성 업무와 달리 많은 시간이 소요되는 서비스를 처리하기

위해 RQ (Reliable Queue)를 제공한다. RQ는 안정적인 서비스를 보장하기 위해 클라이언트의 요청을 디

스크에 관리한다.

또한 RQ는 일반적인 메시지 큐로서 클라이언트간 혹은 서버간 Peer-to-peer 통신을 위해 사용된다.

1.2. 구조

다음은 RQ의 구조이다.

[그림 1.1] RQ 구조

RQ는 Request, Reply, Fail 세 종류의 큐로 구분되어 있다.

● Request 큐

제1장 소개 1

Page 16: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

서비스를 수행하기 전에 tpenq() 처리가 된 요청 데이터는 모두 Request 큐에 저장된다.

● Reply 큐

정상적으로 서비스를 수행하여 반환된 데이터는 서비스 성공이나 실패에 무관하게 모두 Reply 큐에 저

장된다. 특별한 예외로 서비스 이름을 명시하지 않은 데이터는 이 곳으로 저장된다.

● Fail 큐

서비스 수행에 실패하였거나 수행되기 전에 종료된 RQ 데이터들은 Fail 큐에 저장된다.

다음과 같은 경우 Fail 큐에 데이터가 저장된다.

– tpenq() 처리된 데이터가 서버로부터 정상적인 반환 결과를 받지 못했을 경우

– 해당 서비스가 없는 경우

– 서비스에서 정상적으로 반환되지 않은 경우

– Request 큐에 데이터가 있는데 Tmax 시스템이 재시동되었을 때 RQ 타입이 WARM booting일 경우

1.3. 시스템 구성RQ 시스템은 RQ를 관리하는 실제 데이터가 저장되는 RQ 파일 시스템, RQS, RQ 시스템을 사용하는 애

플리케이션을 위한 API, RQ 시스템의 사용 정보와 간단한 관리 기능을 제공하는 tmadmin 네 가지로 구성

된다. API에 관한 내용은 “제3장 API”를, tmadmin에 관한 내용은 “2.2. 시스템 관리”를 참고한다.

1.3.1. RQ 파일 시스템

Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지

정한 디렉터리에 16~2047 MB의 파일을 만들어 RQ 데이터 파일로 사용한다. RQ 데이터 파일은 Tmax 환

경파일에 지정한 RQ명을 이용하여 RQ명.data 라는 파일명으로 생성된다. 사용자는 RQ 데이터 파일의

크기와 시스템이 종료된 후 데이터가 남은 상태의 RQ 파일을 재사용할 것인지 등을 지정할 수 있다.

현재 Tmax 버전에서는 RQ 데이터 파일의 크기가 자동적으로 조절되지 않으므로 사용자가 적절한 값을

지정해야 한다.

1.3.2. RQS

RQS는 CLH(클라이언트 매니저)의 제어를 받으며 실제 RQ 파일에 데이터를 저장하고 읽어 들이는 모든

과정을 관리하고 제어한다. RQS는 자체적인 버퍼를 가지고 실제 디스크에 저장된 데이터와 동기화된 데

2 Tmax Programming Guide (RQ)

Page 17: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

이터를 유지하여 RQ를 사용하는 서비스의 수행에 있어 캐싱 기능을 제공한다. 사용자는 RQS가 디스크

에 데이터를 저장하는 방법을 지정할 수 있다.

1.4. 시스템 운영의 개요아래의 그림은 기본적인 RQ 시스템의 흐름도로서 클라이언트에서 RQ를 통해 서비스를 요청하고 그 결

과값을 RQ를 통해 받아가는 일반적인 사용법을 보여준다.

[그림 1.2] RQ 흐름도

RQ 시스템 흐름 순서는 다음과 같다.

1. 클라이언트에서 ATTACK이라는 서비스를 tpenq()로서 요청한다.

2. 클라이언트의 요청을 받은 Tmax 시스템 핸들러(이하 CLH)는 tpenq()에 대한 처리를 RQ 관리자(이하

RQS)에게 의뢰한다.

3. RQS는 주어진 서비스를 Request 큐(Disk)에 기록한다.

4. RQS는 CLH에게 정상적으로 Request 큐에 서비스를 입력했다는 결과를 전송한다.

5. CLH는 클라이언트에게 서비스 요청에 대한 응답으로 정상적으로 처리되었다는 결과를 전송한다.

제1장 소개 3

Page 18: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

6. RQS는 CLH에게 서비스의 처리를 요청한다.

7. CLH는 요청받은 서비스(ATTACK)를 수행한다.

8. 해당 서비스(ATTCK)가 루틴을 수행 후 tpreturn()을 한다.

9. 서비스(ATTCK)의 결과를 받은 CLH는 그 결과를 RQS로 전송한다.

10.서비스 처리 결과를 받은 RQS는 정상적으로 처리된 경우에는 Reply 큐에 기록하며 실패한 경우에는

Fail 큐에 기록한다.

11.클라이언트는 해당 서비스명(ATTACK)으로 tpdeq()를 요청한다.

12. CLH는 RQS에게 처리 결과를 요청한다.

13. RQS는 디스크 내용에 대한 최신 정보를 메모리에 유지함으로써 추가적인 디스크 I/O없이 응답을 CLH

에 전송한다.

14. CLH는 응답을 클라이언트에게 전송한다.

위에서 보는 바와 같이 RQ를 사용하면 신뢰성은 보장할 수 있지만 디스크에 데이터를 기록하기 때문에

그만큼의 속도는 저하될 수 있다. 따라서 신뢰성이 보장되어야 하고 시간이 많이 걸리는 작업인 경우에 한

해서 RQ를 사용하는 것이 바람직하다.

4 Tmax Programming Guide (RQ)

Page 19: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

1.5. 복구 작업RQ에 저장된 데이터는 시스템 장애 및 네트워크 불안정 등으로 Tmax 시스템이 재시동되더라도 다시 사

용할 수 있다. 데이터 복구를 위해서는 환경파일에 설정이 되어 있어야 한다. 자세한 사항은 “4.2. 응용”의

예제를 참고한다. 복구될 때 Request 큐에 쌓여있던 데이터와 Fail 큐에 쌓여있던 데이터는 Fail 큐로 옮겨

지며 Reply 큐에 쌓여있던 데이터는 그대로 Reply 큐에 위치한다. 이 데이터들은 다시 꺼내어 서비스를

수행하게 하거나 다른 용도로 사용할 수 있다.

[그림 1.3] 시스템 Fail의 RQ

제1장 소개 5

Page 20: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에
Page 21: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

제2장 사용 및 관리

RQ 시스템을 애플리케이션 개발에 적용하기 위해서는 Tmax 환경파일에 RQ를 설정하는 과정과 실제 프

로그램을 개발하는 두 단계의 과정을 거쳐야 한다. 본 장에서는 이들 과정에 대한 설명과 함께 다양한 예

제를 제시하여 애플리케이션을 개발에 있어 RQ의 응용법에 대한 예제를 설명한다.

2.1. 환경설정실제 애플리케이션 개발에 앞서 RQ 시스템을 시작하기 위해서는 기본적인 설정이 필요하다. RQ 시스템

은 서버 그룹단위로 관리되며 Tmax 환경파일에 SVRGROUP 절과 RQ 절의 적절한 정의를 필요로 한다.

참고

Tmax 환경파일 설정에 더 자세한 사항은 Tmax 안내서 중 "Tmax Administration Guide"를 참고한다.

2.1.1. SVRGROUP

RQ 시스템을 사용하기 위해서는 RQ가 속하는 서버그룹을 정의해야 하며 이를 위해 SVRGROUP 절의

기본 필수항목들 외에도 SVGTYPE 항목을 RQMGR로 지정해 주어야 한다. 이 외에도 CPC 등을 설정하

여 시스템 운영의 효율을 높일 수 있다.

SVRGROUP 절의 환경설정 형식은 다음과 같이 정의한다.

*SVRGROUP

SVRGROUP 이름 NODENAME = node-name,

CPC = number,

SVGTYPE = RQMGR

● SVRGROUP 이름 = string

– 크기: 15자 이내

– 서버그룹의 이름을 설정한다. SVRGROUP 절 내에서 유일한 이름이어야 한다.

● NODENAME = string

– 서버그룹이 속한 노드이름을 설정한다. NODE 절에서 정의한 노드이름이어야 한다.

제2장 사용 및 관리 7

Page 22: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

● CPC = numeric

– 범위: 4~128

– RQS 프로세스와 CLH 프로세스 사이의 병렬통신 채널 수를 지정하는 항목 RQ를 사용하지 않으면

무시된다. RQ의 사용이 빈번할 경우 다중의 채널을 유지함으로써 처리속도를 향상시킬 수 있다.

● SVGTYPE = RQMGR

서버그룹의 타입을 정의하는 항목으로 RQ를 사용할 경우 RQMGR이라 지정해야 한다.

사용 예제

*SVRGROUP

svg1 NODENAME = tmax1,

CPC = 4,

SVGTYPE=RQMGR

2.1.2. RQ

각 서버 그룹은 하나 이상의 RQ를 두고 사용할 수 있다. RQ절에는 실제 RQ를 관리하는 방법에 대한 설정

을 한다. RQ절의 항목에는 QSIZE, FILEPATH, BOOT, FSYNC, BUFFERING 등이 있으며 이 중 SVGNAME

은 반드시 설정해 주어야 한다.

RQ 절의 환경설정 형식은 다음과 같이 정의한다.

*RQ

RQ 이름 SVGNAME = server-group-name,

BOOT = COLD | WARM,

QSIZE = number,

BUFFERING = Y | N ,

FSYNC = Y | N ,

FILEPATH = "file-path"

● RQ 이름 = string

– 크기: 14자 이내

– RQ 절에 대한 논리적인 이름이다. RQ 절 내에서 여러 개의 RQ 정의가 가능하며, 각각의 RQ 이름은

유일한 값이어야 한다. 또한 한 서버 그룹에 한개 이상의 RQ를 정의할 수 있다.

● SVGNAME = string

– RQ를 사용하는 서버그룹 이름을 설정한다. SVRGROUP 절에서 정의한 서버그룹 이름이어야 한다.

8 Tmax Programming Guide (RQ)

Page 23: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

● BOOT = COLD | WARM

– 기본값: COLD

– BOOT 필드는 Tmax 시스템이 재부팅될 때 RQ에 저장된 데이터를 조절한다. BOOT 항목이 WARM

인 경우, 시스템 장애복구 후에 큐에 쌓였던 데이터의 복구가 가능하게 된다. COLD로 설정되어 있으

면 Tmax 시스템이 재기동될 때 디스크에 저장된 데이터는 지워진다.

● QSIZE = numeric

– 기본값: 16Mbyte

– 범위: 1~2047Mbyte

– RQ의 크기를 지정하여 사용할 수 있다. RQ는 기본적으로 TMAXDIR의 path 디렉터리에 생성되며 지

속적인 서비스 결과, 지정된 큐의 크기를 넘는 경우에는 tpenq()시에 TPEQFULL 에러가 설정된다.

RQ의 크기는 자동으로 증가하지 않으므로 RQ가 정의한 크기를 초과하여 에러가 발생할 것을 막기

위해 적당한 크기로 설정해야 한다. RQ 파일을 작성한 후에도 RQ 데이터가 저장되지 않으면 Tmax

가 종료될 때 파일이 자동으로 삭제된다.

● BUFFERING = Y | N

– 기본값: Y

– RQ 파일 내용을 메모리에 캐쉬(cache) 할지 여부를 지정한다. N으로 지정하면 RQ처리가 상대적으

로 느려지나 요구되어지는 메모리가 작아진다.

● FSYNC = Y | N

– 기본값: Y

– 아래의 항목인 BUFFERING을 N으로 설정하더라도 OS는 데이터를 바로 디스크에 저장하는 것이 아

니고 최장 30초 동안 메모리에 보관한다. 이러한 대기 시간을 없애고 바로 메모리의 데이터를 디스크

에 저장하도록 하는 항목이다. 이 항목이 NO이면 시스템 장애가 발생할 때 데이터를 잃을 가능성이

있지만 RQ처리 속도는 빨라진다. 이 항목이 Y일 때는 RQ 데이터가 메모리를 사용하지 않고 항상 디

스크에 안전하게 저장되지만 NO를 설정 했을 때보다 처리 속도가 늦어진다.

● FILEPATH = literal

– 기본값: $(TMAXDIR)/path/RQ명.data

– RQ에서 사용되는 파일 위치를 지정한다. 이 필드는 RQ 데이터 파일을 생성하며 이는 전체 파일 이름

과 디렉터리 이름으로 정의 되어야 한다.

제2장 사용 및 관리 9

Page 24: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

참고

TMAXDIR은 Tmax를 설치한 홈 디렉터리를 뜻한다. 이후 Tmax 홈 디렉터리를 TMAXDIR라고 칭한

다.

사용 예제

*RQ

rqtest SVGNAME = svg1,

BOOT = COLD,

QSIZE = 1024,

BUFFERING = Y,

FSYNC = Y,

FILEPATH = "/user1/tmax/myrq.data"

2.1.3. Tmax 환경파일 예제

*DOMAIN

tmax ...

*NODE

tmax1 ...

*SVRGROUP

svg1 NODENAME = tmax1,

CPC = 4,

SVGTYPE=RQMGR

*RQ

rqtest SVGNAME = svg1,

BOOT = COLD,

QSIZE = 1024,

BUFFERING = Y,

FSYNC = Y,

FILEPATH = "/user1/tmax/myrq.data"

*SERVER

...

*SERVICE

10 Tmax Programming Guide (RQ)

Page 25: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

2.2. 시스템 관리RQ 시스템의 관리는 일반 Tmax 시스템의 관리 방법과 크게 다르지 않다. 관리자는 RQ시스템을 따로 기

동/종료 하거나 어드민 툴을 이용하여 RQ의 상태정보를 확인할 수 있다.

본 절에서는 RQ시스템을 시동/종료하고 간단히 관리툴을 이용하는 방법에 대해 설명한다.

2.2.1. 시동 및 종료

RQ는 “tmboot” 명령어에 의해 Tmax 시스템과 함께 기동된다. RQ만을 독립적으로 기동하거나 종료할 때

는 “tmboot –q RQ 관리 서버그룹명” 또는 “tmdown –q RQ 관리 서버그룹명” 으로 수행할 수 있다.

다음과 같이 “tmboot –T” 명령어로 Tmax의 기본 엔진들만 기동시킨 경우 RQS가 기동되지 않는다.

[그림 2.1] tmboot -T

다음과 같이 “tmboot –q RQ 관리 서버그룹명”으로 RQ를 관리하는 서버그룹에 해당하는 RQS를 기동할

수 있다.

[그림 2.2] tmboot -q

RQ를 종료하고자 할 때도 같은 방법으로 동일하게 사용한다.

다음과 같이 “tmdown –q RQ 관리 서버그룹명”으로 RQ를 관리하는 서버그룹에 해당하는 RQS를 종료

할 수 있다.

[그림 2.3] tmdown -q

참고

자세한 내용은 Tmax 안내서 중 “Tmax Administration Guide”를 참고한다.

제2장 사용 및 관리 11

Page 26: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

2.2.2. 상태 정보 관리

Tmax 시스템이 기동되면 Tmax에서 제공하는 관리 프로그램인 tmadmin을 이용하여 시스템의 상태를 자

세히 관리할 수 있다.

tmadmin에서 RQ와 관련한 명령으로는 rqs가 있다. rqs는 현재 사용 가능한 RQ의 상태를 출력하거나 디

스크 큐에 쌓여있는 데이터를 조작할 수 있다. rqs의 옵션으로는 -l, -s, -c, -f 가 있다.

다음은 rqs 의 옵션에 대한 설명이다.

설명옵션

Tmax 환경파일의 RQ 절에 정의된 모든 RQ명을 출력한다.l

RQ명으로 지정된 RQ의 상태정보를 출력한다. Request, Reply, Fail 큐의 모

든 상태를 출력한다.

-s RQ명

현재 Tmax 3.8버전에서는 의미가 없는 옵션이다.-c RQ명

RQ이름으로 지정된 RQ에 쌓인 데이터들을 모두 삭제한다. 단 이 옵션을 사

용하기 위해서는 tmadmin을 실행할때 –m 옵션으로 관리자 모드에서만 사용

해야 한다.

-f RQ명

tmadmin의 실행 모드는 두가지가 있다. 하나는 tmadmin [–s] 로 실행되는 서브관리자 모드이고 다른 하나

는 tmadmin –m 으로 실행되는 마스터 관리자 모드이다. 서브 관리자의 경우 시스템 운영 상태를 확인할

수는 있지만 시스템 설정을 바꿀수는 없다.

tmadmin에서 RQ의 상태정보를 출력하는 rqs –l 이나 rqs –s 같은 명령은 서브 관리자 모드로도 가능하지

만 RQ 의 통계정보와 내용을 지우는 rqs –c, rqs –f 와 같은 명령은 마스터 관리자 모드로 실행해야만 가능

하다.

다음은 $ tmadmin서브 관리자 모드로 실행한 경우이다.

[그림 2.4] rqs -l, -s

12 Tmax Programming Guide (RQ)

Page 27: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

다음은 $ tmadmin –m 마스터 관리자 모드로 실행한 경우이다.

[그림 2.5] rqs -f

참고

자세한 내용은 Tmax 안내서 중 “Tmax Administration Guide”를 참고한다.

제2장 사용 및 관리 13

Page 28: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에
Page 29: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

제3장 API

RQ를 사용하는 API는 크게 두 가지로 나눌수 있다.

● RQ를 직접적으로 사용하는 API

해당하는 API는 다음과 같다.

설명API

서버/클라이언트에서 RQ에 데이터를 저장하는 함수이다.tpenq

서버/클라이언트에서 RQ로부터 데이터를 로드하는 함수이다.tpdeq

클라이언트/서버에서 사용되는 함수로 해당 RQ의 Fail 큐에 쌓인 요청 데이

터를 다시 Request 큐에 넣어주는 함수이다.

tpreissue

● RQ 사용을 보조하기 위한 API

해당하는 API는 다음과 같다.

설명API

서버/클라이언트에서 tpdeq()로 RQ에서 데이터를 읽은 경우, 해당 데이터의

서비스 이름을 제공하는 함수이다.

tpextsvcname

서버/클라이언트에서 tpdeq()로 RQ에서 데이터를 읽은 경우, 해당 데이터에

대한 상세한 정보를 제공하는 함수이다.

tpextsvcinfo

서버/클라이언트에서 사용되는 함수로 RQ에 저장된 데이터의 통계를 요청

한다.

tpqstat

서버/클라이언트에서 사용되는 함수로 RQ에 저장된 데이터 중 지정한 서비

스에 대한 통계를 요청하는 함수로 현재 RQ에 적체되어있는 데이터의 통계

를 구한다.

tpqsvcstat

서버/클라이언트에서 트랜잭션을 지원하며 RQ 데이터를 저장하는 함수이다.tpenq_ctl

서버/클라이언트에서 트랜잭션을 지원하며 RQ로부터 데이터를 로드하는 함

수이다.

tpdeq_ctl

참고

해당 안내서에서는 대표적인 API들만을 간략하게 설명하며 각 API들에 대한 자세한 설명과 예제는

Tmax 안내서 중 "Tmax Reference Guide"를 참고한다.

제3장 API 15

Page 30: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

3.1. tpenq서버/클라이언트에서 RQ에 데이터를 저장하는 함수이다. Tmax 시스템은 시스템의 장애나 에러로 인한

서비스가 불가능한 상태에서도 RQ에 저장된 데이터는 정합성을 보장할 수 있다. RQ에 데이터를 저장해

두었다가, 여러 가지 상황으로 시스템이 다운되고, 복구 이후 다시 실행되면 이전에 처리하지 못한 데이터

를 계속해서 처리할 수 있다.

tpcall()이나 tpacall()로 서비스를 요청한 경우, 해당 서비스가 수행할 데이터가 누적되어 있다면 서비스

를 요청한 데이터도 대기(waiting)한다. 이 때 시스템의 장애나 에러로 인해 시스템이 다운되면 대기 중인

데이터는 분실된다.

이러한 문제점을 보안하고 데이터의 정합성을 보장할 수 있도록 tpenq()는 서비스를 요청하는 경우 데이

터를 RQ에 저장한다. 트랜잭션 모드에서 수행해도, 트랜잭션 모드에서 제외되기 때문에 트랜잭션 모드에

서 함수를 수행하는 중 에러가 발생해도 트랜잭션에는 영향을 주지 않는다.

● 프로토타입

# include <tmaxapi.h>

int tpenq (char *qname, char *svc, char *data, long len, long flags)

● 파라미터

설명파라미터

데이터를 저장할 RQ의 이름으로 이 이름은 환경파일에 등록된 이름이어야

한다. 데이터를 RQ에 저장하고, svc명이 NULL이 아니면 즉시 서비스를 요청

한다.

qname

svc 이름이 NULL이면 데이터는 RQ에 저장되고 서비스는 수행되지 않는다.

이 경우 나중에 tpdeq()를 이용하여 서비스를 요청해야 한다.

그러나 svc로 명명된 서비스가 없거나 또는 서비스를 수행하고 처리 결과를

받지 않은 상태에서 시스템 장애가 발생할 경우에 이 데이터는 내부적으로

Fail 큐에 저장된다. 데이터는 tpdeq()로 서비스를 재요청하거나 에러 처리를

해야 한다.

NULL 또는 Tmax 환경파일에 등록된 서비스 이름을 지정한다. NULL이 지정

된 경우 Reply 큐에 데이터가 기록된다. 따라서 tpdeq() 로 해당 데이터를 얻

어온 후 처리해야 한다.

svc

서비스 이름이 지정된 경우 Request 큐에 데이터가 기록된 후 해당 서비스가

처리된다. svc로 명명된 서비스가 없거나 서비스가 실패한 경우 또는 서비스

를 수행하고 처리 결과를 받지 않은 상태에서 시스템 장애가 발생할 경우에

이 데이터는 내부적으로 Fail 큐에 저장된다.

16 Tmax Programming Guide (RQ)

Page 31: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명파라미터

NULL 값인 경우를 제외하고 반드시 tpalloc()으로 할당된 버퍼에 대한 포인터

이어야 한다. data의 유형(type)과 하위 유형(subtype)은 svc가 지원하는 유

형들이어야 한다.

data

송신하는 데이터의 길이이다.len

- data가 가리키는 버퍼가 특별한 길이 명시가 필요없는 버퍼 유형(STRING,

STRUCT, X_COMMON, X_C_TYPE)인 경우 len은 무시되고 0이 사용된다.

- data가 가리키는 버퍼가 길이 명시가 반드시 필요한 버퍼 유형( X_OCTET,

CARRAY, MULTI STRUCTURE)인 경우 len은 0이 될 수 없다.

- data가 NULL인 경우 len은 무시되고 데이터없이 서비스 요청이 송신된다.

flags로 사용 가능한 값은 다음과 같다.

설명설정값

- svc가 NULL이 아닌 경우 svc로 명명된 서비스를 요청하고, 처리 결과를 RQ

에 저장된다. 서비스 처리 결과를 받으려면 tpdeq()를 이용해서 받는다.

TPRQS

- svc가 NULL인 경우 데이터는 단지 RQ에 저장되고 서비스는 수행하지 않

는다.

- svc가 NULL이 아닌 경우 svc로 명명된 서비스는 요청하지만, 처리 결과는

RQ에 저장하지 않겠다는 의미이다.

TPNOREPLY

- svc가 NULL인 경우 데이터는 단지 RQ에 저장되고 서비스는 수행하지 않

는다.

서비스별 RQ 데이터를 관리할 때 사용한다.TPFUNC

플래그가 설정되지 않았다면 처음 tpenq()를 통해 저장된 데이터가 제거(de

queued)된다. 데이터가 저장되기 전에 dequeue해야 할 경우에는 tpenq()를

수행할 때 TPFUNC를 같이 설정한다.

tpenq()의 첫번째 인자가 NULL이 아닌 서비스 이름으로 지정된 경우 해당 서

비스를 수행한 후 서버가 반환한 (TPSVCSUCCESS 나 TPSVCFAIL에 관계

TPNOFLAGS

없이) 결과는 클라이언트의 버퍼에 저장된다. 이 값을 받아오기 위해서는

tpdeq()를 수행할 때에도 플래그를 TPNOFLAGS로 주어야 한다.

서버가 결과값을 반환하기 전에 에러가 발생하면 데이터는 Fail 큐에 저장되

며 이 값은 tpdeq()를 수행할 때 TPRQS 플래그로 받아와야 한다.

제3장 API 17

Page 32: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

● 반환값

설명반환값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음과 같은 상황에서 tpenq()는 실패하고, tperrno에 아래 값 중 하나가 설정된다.

설명에러 코드

인수가 유효하지 않다.[TPEINVAL]

예를 들어, data가 tpalloc()으로 할당되지 않은 버퍼를 가리키거나 또는 flags

가 유효하지 않다.

존재하지 않는 qname이 사용되었다.[TPENOENT]

지속적인 서비스 결과로 지정된 큐의 크기를 넘는 경우에 발생한다.[TPEQFULL]

TPSIGRSTRT가 설정되지 않은 상태에서 시그널이 수신되었다.[TPGOTSIG]

tpenq()이 부적절한 상황에서 호출되었다.[TPEPROTO]

Tmax 시스템 에러가 발생한 경우로 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

● 예제

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

void main(int argc, char *argv[])

{

int ret;

char *buf;

long len;

ret=tpstart((TPSTART_T *)NULL);

if (ret==-1) { error processing }

buf = (char *)tpalloc(“STRING”, NULL, 0);

if (buf==NULL) { error processing }

data process....

ret=tpenq(“RQ”, “SERVICE”, (char *)buf, strlen(buf), TPRQS);

if (ret==-1) { error processing }

18 Tmax Programming Guide (RQ)

Page 33: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

data process....

ret=tpdeq(“RQ”, “SERVICE”, (char **)&buf, (long *)&len, TPRQS);

if (ret==-1) { error processing }

data process....

tpfree(buf);

tpend();

}

● 관련 함수

tpdeq(), tpqstat()

3.2. tpdeq서버/클라이언트에서 RQ로부터 데이터를 로드하는 함수이다. tpenq()를 이용하여 서비스를 요청한 결과

를 받거나 서비스명을 NULL로 해서 저장한 데이터를 읽는다. tpenq()를 호출할 때 flags에 TPNOREPLY

를 설정하면 서비스는 결과를 받을 수 없다. 그러므로 트랜잭션 모드에서 tpdeq() 함수를 수행 도중 에러

가 발생해도 트랜잭션에는 영향을 미치지 않는다.

● 프로토타입

# include <tmaxapi.h>

int tpdeq (char *qname, char *svc, char **data, long *len, long flags)

● 파라미터

설명파라미터

데이터를 저장할 RQ의 이름으로 config 파일에 등록된 이름이어야 한다.qname

tpenq()를 호출하는 경우 svc에 전달한 이름이어야 한다.svc

서비스명으로 tpenq()를 호출한 경우, 서비스가 자동 요청되고, 결과가 RQ에

저장된다. 서비스 결과를 받기 위해서는 tpdeq()도 동일한 서비스명을 입력

해야 한다. 서비스명을 NULL로 tpenq()를 호출한 경우 tpdeq()도 동일한 서

비스명을 입력한다. 서비스명이 NULL인 경우 서비스명에 상관없이 큐에 쌓

여있는 모든 데이터를 하나씩 로드할 수 있다.

tpenq() 시 에러나 시스템 장애로 인해 fail 큐에 저장된 데이터를 tpdeq()하기

위해서는 svc에 _rq_sub_queue_name[TMAX_FAIL_QUEUE]를 주고 deq해

야 한다.

tpalloc()에 의해 할당된 버퍼에 대한 포인터이다. 함수가 성공적으로 반환되

면, *data는 수신된 데이터가 저장된다.

*data

tpdeq()가 성공적으로 수신한 데이터의 길이이다. tpdeq()는 필요하다면 응답

내용이 지정된 버퍼에 수신될 수 있도록 버퍼 크기를 증가시킨다. len은 *data

len

제3장 API 19

Page 34: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명파라미터

의 데이터의 길이로 *data는 수신 데이터가 커서 변경 될 수도 있고, 이 외에

다른 이유에 의해서도 변경될 수 있다. len이 호출 전 버퍼의 총 크기보다 크

다면, len이 그 버퍼의 새로운 크기가 된다.

len이 0으로 반환되었다면, 어떤 데이터도 수신되지 않고 *data와 len이 지시

하는 버퍼 모두 아무런 변화가 없다. *data나 len이 NULL이 되는 것은 에러이

다.

flags로 사용 가능한 값은 다음과 같다.

설명설정값

RQ에서 데이터를 가져올때 사용된다. reply 큐로부터 서비스의 결과를 가져

오기 위해서 설정된다.

TPRQS

서비스별 RQ 데이터를 관리할 때 사용한다. 플래그가 설정되지 않았다면 처

음 tpenq()를 통해 저장된 데이터가 제거된다.

TPFUNC

데이터가 저장되기 전에 제거해야 할 경우에는 tpenq() 호출할 때 TPFUNC

를 같이 설정한다.

tpdeq() 호출할 때 블록 타임아웃 시간동안 메시지가 올 때까지 기다린다TPBLOCK

TPBLOCK과 함께 사용되면 블록 타임아웃 시간에 관계 없이 응답이 올 때까

지 기다리게 된다.

TPNOTIME

데이터를 자신이 접속한 클라이언트의 버퍼에서 가져오고자 할 때 사용한다.0(zero)

● 반환값

설명반환값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다)

● 오류

tpdeq() 호출에 실패할 경우 상황에 따라 tperrno에 다음 에러 값들이 설정된다.

설명에러 코드

인수가 유효하지 않다.[TPEINVAL]

예를 들어, 데이터가 tpalloc()으로 할당되지 않은 버퍼를 가리키거나, 또는

flags가 유효하지 않다.

20 Tmax Programming Guide (RQ)

Page 35: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명에러 코드

TPSIGRSTRT가 설정되지 않은 상태에서, 시그널이 수신되었다.[TPGOTSIG]

서비스 이름이 잘못 되었거나 제거할 데이터가 없는 경우 해당 조건을 만족

하는 제거할 데이터를 찾지 못했다.

[TPEMATCH]

존재하지 않는 qname이 사용되었다.[TPENOENT]

tpdeq()이 부적절한 상황에서 호출되었다.[TPEPROTO]

Tmax 시스템 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

● 예제

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

void main(int argc, char *argv[])

{

int ret;

char *buf;

long len;

ret=tpstart((TPSTART_T *)NULL);

if (ret==-1) { error processing }

buf = (char *)tpalloc(“STRING”, NULL, 0);

if (buf==NULL) { error processing }

data process....

ret=tpenq(“RQ”, “SERVICE”, (char *)buf, strlen(buf), TPRQS);

if (ret==-1) { error processing }

data process....

ret=tpdeq(“RQ”, “SERVICE”, (char **)&buf, (long *)&len, TPRQS);

if (ret==-1) { error processing }

data process....

tpfree(buf);

tpend();

}

● 관련 함수

tpenq(), tpqstat()

3.3. tpreissue서버/클라이언트에서 사용되는 함수로 해당 RQ의 Fail 큐에 쌓인 요청 데이터를 다시 Request 큐에 넣어

준다. tpenq() 등으로 RQ를 통한 서비스 수행 중 네트워크 불안정이나 기타 서버측의 오류로 서비스 수행

제3장 API 21

Page 36: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

을 실패하여 Fail 큐에 쌓인 클라이언트의 서비스 요청 데이터를 다시 request 큐에 넣어주는 함수이다. 저

장된 데이터를 해당 서비스로 전달해서 결과를 Reply 큐에 저장한다.

● 프로토타입

#include <tmaxapi.h>

int tpreissue(char *qname, char *filter, long flags)

● 파라미터

설명파라미터

qname은 Tmax 시스템에 등록된 RQ의 이름이다.qname

현재 지원하지 않으며 NULL로 설정하여야 한다.filter

현재 지원하지 않으며 TPNOFLAGS으로 설정하여야 한다.flags

● 반환값

설명반환값

함수 호출에 성공한 경우0

함수 호출에 실패한 경우-1

(상세한 에러 내용은 tperrno에 세팅된다.)

● 오류

tpreissue() 수행 결과가 실패일 경우 상황에 따라 tperrno에 다음 에러 값들이 설정된다.

설명에러 코드

함수에 사용된 인자값이 잘못된 경우로 qname이 NULL이거나 현재 지원하

지 않는 filter나 flags에 값을 설정했을 경우 발생한다.

[TPEINVAL]

qname에 해당하는 RQ가 존재하지 않는다.[TPENOENT]

Tmax 시스템에 에러가 발생하였다. 네트워크이 불량한 경우 발생한다.[TPESYSTEM]

● 관련 함수

tpenq(), tpdeq()

3.4. tpextsvcname

서버/클라이언트에서 tpdeq() 로 RQ에서 데이터를 읽은 경우, 해당 데이터의 서비스명을 알고자 할 때 사

용한다. tpextsvcname() 함수는 Fail 큐에 저장되어 있는 데이터를 tpdeq()로 읽은 경우에 사용한다.

22 Tmax Programming Guide (RQ)

Page 37: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

● 프로토타입

# include <tmaxapi.h>

int tpextsvcname (char *data, char *svc )

● 파라미터

설명파라미터

tpdeq() 함수를 이용하여 RQ로부터 읽은 데이터가 저장되어 있는 포인터이

다. tpalloc()으로 할당된다.

data

알아오고자 하는 서비스 이름이 수신될 버퍼이다.svc

● 반환값

설명반환값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음 상황에서 tpextsvcname()는 실패하고 tperrno에 아래 값 중 하나가 설정된다.

설명에러 코드

인수가 유효하지 않다.[TPEINVAL]

예를 들면 data에 tpalloc()으로 할당되지 않은 버퍼가 전달되는 경우이다.

Tmax 시스템 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

● 예제

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

void main(int argc, char *argv[])

{

int ret;

char *buf, *svc_name;

long len;

ret=tpstart((TPSTART_T *)NULL);

제3장 API 23

Page 38: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

if (ret==-1) { error processing }

buf = (char *)tpalloc(“STRING”, NULL, 0);

if (buf==NULL) { error processing }

data process....

ret=tpenq(“RQ”, “SERVICE”, (char *)buf, strlen(buf), TPRQS);

if (ret==-1) { error processing }

data process....

ret=tpdeq(“RQ”, “SERVICE”, (char **)&buf, (long *)&len, TPRQS);

if (ret==-1) { error processing }

ret=tpextsvcname(buf, svc_name);

if (ret==-1) { error processing }

printf(“svc name : %s ,”,svc_name);

data process....

tpfree(buf);

tpend();

}

● 관련 함수

tpenq(), tpdeq()

3.5. tpextsvcinfo서버/클라이언트에서 tpdeq() 로 RQ에서 데이터를 읽은 경우, 해당 데이터에 대한 상세한 정보를 제공하

는 함수이다.

● 프로토타입

# include <tmaxapi.h>

int tpextsvcinfo (char *data, char *svc, , int *type, int *errcode )

● 파라미터

설명파라미터

tpalloc()으로 할당되어 tpdeq()를 이용하여 RQ로부터 읽은 데이터가 저장되

어 있는 포인터이다.

data

해당 데이터의 서비스 명을 받아오기 위한 포인터이다.svc

해당 데이터의 처리 결과를 나타내며 다음 중 한가지의 값을 설정한다.type

- TPREQ(0) : tpenq()를 수행할 때 두번째 인자로 NULL을 지정한 경우 tpenq

가 정상적으로 된 경우 이와 같이 type에 TPREQ가 설정된다.

24 Tmax Programming Guide (RQ)

Page 39: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명파라미터

- TPFAIL(1) : tpenq()를 수행할 때 두번째 인자로 서비스 명을 지정한 경우

서비스에서 tpreturn의 첫번째 인자로 TPFAIL이 호출된 경우에 이와 같이

type에 TPFAIL이 설정된다.

- TPSUCCESS(2) : tpenq()를 수행할 때 두번째 인자로 서비스 명을 지정한

경우 서비스에서 tpreturn의 첫번째 인자로 TPSUCCESS가 호출된 경우에

이와 같이 type에 TPSUCCESS가 설정된다.

- TPERR(-1) : tpenq()가 실패하여 Fail 큐에 송신 된 경우 이와 같이 type에

TPERR이 설정된다.

에러가 발생하는 경우 해당되는 에러 코드 값이 저장된다.errcode

● 반환값

설명반환값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음 상황에서 tpextsvcname()는 실패하고 tperrno에 아래 값 중 하나가 설정된다.

설명에러 코드

인수가 유효하지 않다. 예를 들면 data나 svc가 NULL이다.[TPEINVAL]

인수가 유효하지 않다. 예를 들면 data가 RQ에서 받아온 data가 아니다.[TPEITYPE]

Tmax 시스템 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

● 관련 함수

tpenq(), tpdeq(), tpextsvcname()

3.6. tpqstat서버/클라이언트에서 사용되는 함수로 RQ에 저장된 데이터의 통계를 요청한다. RQ는 내부적으로 _fail

queue, _request queue, _reply queue의 3 부분으로 구성되어있다. 플래그 값을 이용하여 각 큐에 저장된

데이터 통계를 구할 수 있다.

제3장 API 25

Page 40: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

● 프로토타입

# include <tmaxapi.h>

int tpqstat (char *qname, long flags )

● 파라미터

설명파라미터

Tmax 환경파일에 등록된 RQ 이름을 나타낸다.qname

다음은 flags로 사용 가능한 값들이다.

설명설정값

_fail queue, _request queue, _reply queue의 데이터 통계를 낼 때 사용한다.0

_fail queue의 데이터 통계를 낼 때 사용한다.1

_request queue의 데이터 통계를 낼 때 사용한다.2

_request queue의 데이터 통계를 낼 때 사용한다.3

● 반환값

설명반환값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당되는 값이 설정된다.)

● 오류

tpqstat() 실패 하는 경우 상황에 따라 tperrno에 다음 에러 값들이 설정된다.

설명에러 코드

인수가 유효하지 않다.[TPEINVAL]

예를 들어, qname이 NULL이거나, qname에 해당하는 큐가 없거나 flags가

유효하지 않다.

tpqstat()가 부적절한 상황에서 호출 되었다.[TPEPROTO]

Tmax 시스템 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

● 예제

26 Tmax Programming Guide (RQ)

Page 41: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

void main(int argc, char *argv[])

{

int ret, i;

char *buf;

if (argc!=2) { error processing }

ret=tpstart((TPSTART_T *)NULL);

if (ret==-1) {error processing }

buf = (char *)tpalloc(“STRING”, NULL, 0);

if (buf==NULL) { error processing }

strcpy(buf, argv[1]);

data process…

ret=tpenq(“RQ”, NULL, (char *)buf, strlen(buf), TPRQS);

if (ret==-1) {error processing }

printf(“qstat :”);

for (i=0;i<4;i++) {

ret=tpqstat(“rq”, i);

if (ret==-1) {error processing }

printf(“ %d”,ret); /* qstat : 1 0 0 1 */

}

printf(“\n”);

data process…

ret=tpenq(“RQ”, “SERVICE”, (char *)buf, strlen(buf), TPRQS);

if (ret==-1) {error processing }

printf(”qstat :”);

for (i=0;i<4;i++) {

ret=tpqstat(“rq”, i);

if (ret==-1) {error processing }

printf(” %d”,ret); /* qstat : 2 0 0 2 */

}

printf(“\n”);

tpfree((char *)buf);

tpend();

}

● 관련 함수

tpenq(), tpdeq()

제3장 API 27

Page 42: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

3.7. tpqsvcstat서버/클라이언트에서 사용되는 함수로 RQ에 저장된 데이터 중 지정한 서비스에 대한 통계를 요청하는 함

수로 현재 RQ에 적재되어있는 데이터의 통계를 구한다. RQ는 내부적으로 _fail queue, _request queue,

_ reply queue의 세 부분으로 구성되어있다. 플래그값을 이용하여 각 큐에 저장된 데이터 통계를 구할 수

있다.

● 프로토타입

# include <tmaxapi.h>

int tpqsvcstat (char *qname, char * svc, long flags )

● 파라미터

설명파라미터

Tmax 환경 파일에 등록된 RQ 이름을 설정한다.qname

통계정보를 얻고 싶은 서비스 이름이다. NULL일 경우 tpqstat()과 동일한 의

미를 갖는다.

svc

flags로 사용 가능한 값은 다음과 같다.

설명설정값

Request, Reply, Fail 큐의 데이터 통계를 낼 때 사용한다.0(TMAX_ANY_QUEUE)

Fail 큐의 데이터 통계를 낼 때 사용한다.1(TMAX_FAIL_QUEUE)

Request 큐의 데이터 통계를 낼 때 사용한다.2(TMAX_REQ_QUEUE)

Reply 큐의 데이터 통계를 낼 때 사용한다.3(TMAX_RPLY_QUEUE)

● 반환값

설명반환값

함수 호출에 실패한 경우-1

( tperrno에 에러 상황에 해당되는 값이 설정된다. )

● 오류

tpqscvstat() 처리 결과가 실패일 경우 상황에 따라 tperrno에 다음 에러 값들이 설정된다.

설명에러 코드

인수가 유효하지 않다.[TPEINVAL]

28 Tmax Programming Guide (RQ)

Page 43: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명에러 코드

예를 들어, qname이 NULL이거나, qname에 해당하는 큐가 없거나 type이 유

효하지 않은 경우이다.

tpqscvstat()가 부적절한 상황에서 호출되었다.[TPEPROTO]

Tmax 시스템 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

● 관련 함수

tpenq(), tpdeq(), tpqstat()

3.8. tpenq_ctl서버/클라이언트에서 트랜잭션을 지원하며 RQ 데이터를 저장하는 함수이다.

Tmax 시스템은 시스템의 장애나 에러로 인한 서비스가 불가능한 상태에서도 RQ에 저장된 데이터는 정

합성을 보장할 수 있다. RQ에 데이터를 저장해 두었다가, 여러 가지 상황으로 시스템이 다운되고, 복구 이

후 다시 실행되면 이전에 처리하지 못한 데이터를 계속해서 처리할 수 있도록 한다.

tpcall()이나 tpacall()로 서비스를 요청한 경우, 해당 서비스가 수행할 데이터가 누적된 경우, 방금 서비스

를 요청한 데이터도 대기(wating)한다. 이 때 시스템의 장애나 에러로 인해 시스템이 다운되면 대기 중인

데이터는 분실되게 된다. 이러한 문제점을 보안하고 데이터의 정합성을 보장할 수 있도록 tpenq_ctl()는

서비스를 요청할 때 데이터를 RQ에 저장하는 함수이다.

tpenq_ctl() 함수는 트랜잭션 모드에서 수행하면, 데이터를 RQ에 저장하기까지 트랜잭션으로 처리된다.

2번 이상의 tpenq_ctl()을 하나의 트랜잭션으로 묶은 경우 모든 데이터가 RQ에 저장되기까지 tpdeq_ctl()

를 통해 데이터를 로드할 수 없으며, 저장되는 도중 에러가 발생하면 롤백된다.

● 프로토타입

#include <usrinc/tmaxapi.h>

int tpenq_ctl(char *qname, char *svc, TMQCTL *ctl, char *data, long len,

long flags);

● 파라미터

설명파라미터

데이터를 저장할 RQ의 이름으로 환경파일에 등록된 이름이어야 한다.qname

tpenq_ctl()는 데이터를 RQ에 저장하고, svc 이름이 NULL이 아니면 즉시 서

비스를 요청한다.

svc

svc 이름이 NULL이면 데이터는 RQ에 저장되고 서비스는 수행되지 않는다.

이 경우 나중에 tpdeq_ctl()를 이용하여 서비스를 요청해야 한다. svc로 명명

제3장 API 29

Page 44: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명파라미터

된 서비스가 없거나 또는 서비스를 수행하고 처리 결과를 받지 않은 상태에

서 시스템 장애가 발생할 경우에 이 데이터는 내부적으로 Fail 큐에 저장된다.

이 데이터도 tpdeq_ctl()로 서비스를 재요청하거나 에러 처리를 해야 한다.

TMQCTL의 det_time를 사용하여 일정시간을 넣어주면 그 시간 이후에 svc

call이 된다.

ctl

deq_time을 설정할 때는 현재시간에 delay_time를 주어야 한다. delay_time

을 3으로 주고 싶은 경우 cur_time + 3과 같이 주어야 한다.

TMQCTL의 기능 중 현재는 deq_time만 지원하며, deq_time는 트랜잭션과

함께 사용할 수 없다.

NULL값인 경우를 제외하고 반드시 tpalloc()으로 할당된 버퍼에 대한 포인터

이어야 한다.

data

data의 유형(type)과 하위 유형(subtype)은 svc가 지원하는 유형들이어야 한

다.

송신하는 데이터의 길이이다.len

- data가 가리키는 버퍼가 특별한 길이 명시가 필요 없는 버퍼 유형(STRING,

STRUCT, X_COMMON, X_C_TYPE)이라면 len은 무시되고 보통 0이 사용

된다.

- data가 가리키는 버퍼가 길이 명시가 반드시 필요한 버퍼 유형( X_OCTET,

CARRAY, MULTI STRUCTURE)이라면 len은 0이 될 수 없다.

- data가 NULL인 경우 len은 무시되고 데이터없이 서비스 요청이 송신된다.

flags로 사용 가능한 값은 다음과 같다.

설명설정값

- svc가 NULL이 아닌 경우 svc로 명명된 서비스를 요청하고, 처리 결과를 RQ

에 저장된다. 서비스 처리 결과를 받으려면 tpdeq_deq() 함수을 이용하여 받

는다.

TPRQS

- svc가 NULL인 경우 데이터는 단지 RQ에 저장되고 서비스는 수행하지 않

는다.

- svc가 NULL이 아닌 경우 svc로 명명된 서비스는 요청하지만, 처리 결과는

RQ에 저장하지 않는다.

TPNOREPLY

- svc가 NULL인 경우 데이터는 단지 RQ에 저장되고 서비스는 수행하지 않

는다.

30 Tmax Programming Guide (RQ)

Page 45: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명설정값

서비스별 RQ 데이터를 관리 할 때 사용한다.TPFUNC

TPFUNC 플래그가 설정되지 않았다면 처음 tpenq_ctl()를 통해 저장된 데이

터가 제거(dequeued)된다. 데이터가 저장되기 전에 해야할 경우에는

tpenq_ctl()를 호출될 때 TPFUNC를 같이 설정한다.

서비스 처리 결과를 RQ에 저장하지 않고, 함수 호출자가 접속되어 있는 Tmax

시스템의 클라이언트 버퍼에 저장한다. 서비스는 RQ를 통해 요구하지만 결

0(zero)

과는 tpcall()처럼 함수 호출자가 접속한 클라이언트의 버퍼에서 가져 오고자

할 때 사용한다.

처리 결과를 받기 위해서는 tpdeq_ctl()를 호출할 때 flags에 0(zero)을 설정해

야 한다.

● 반환값

설명반환값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

다음과 같은 상황에서 tpenq_ctl()는 실패하고, tperrno에 아래 값 중 하나가 설정된다.

설명에러 코드

인수가 유효하지 않다.[TPEINVAL]

예를 들어, data가 tpalloc()으로 할당되지 않은 버퍼를 가리키거나 또는 flags

가 유효하지 않다.

존재하지 않는 qname이 사용되었다.[TPENOENT]

지속적인 서비스 결과로 지정된 큐의 크기를 넘는 경우에 발생한다.[TPEQFULL]

TPSIGRSTRT가 설정되지 않은 상태에서 시그널이 수신되었다.[TPGOTSIG]

tpenq_ctl()이 부적절한 상황에서 호출되었다.[TPEPROTO]

Tmax 시스템 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

제3장 API 31

Page 46: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

● 예제

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

main(int argc, char *argv[])

{

char *sndbuf, *rcvbuf;

long rcvlen, sndlen, revent;

int ret, i, cd;

TMQCTL *ctl;

long t;

ctl = (TMQCTL*)malloc(sizeof(TMQCTL));

memset(ctl, 0, sizeof(TMQCTL));

time(&t);

ctl->deq_time = (int)t + 3;

if (argc != 2) {

printf(“Usage: toupper string\n”);

exit(1);

}

if ( (ret = tmaxreadenv( “tmax.env”,”TMAX” )) == -1 ){

printf( “tmax read env failed\n” );

exit(1);

}

if (tpstart((TPSTART_T *)NULL) == -1){

printf(“tpstart failed\n”);

exit(1);

}

if ((sndbuf = (char *)tpalloc(“STRING”, NULL, 0)) == NULL) {

printf(“sendbuf alloc failed !\n”);

tpend();

exit(1);

}

if ((rcvbuf = (char *)tpalloc(“STRING”, NULL, 0)) == NULL) {

printf(“recvbuf alloc failed !\n”);

tpfree((char *)sndbuf);

tpend();

exit(1);

32 Tmax Programming Guide (RQ)

Page 47: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

}

ret = tx_begin();

if(ret < 0)

{

fprintf(stderr, “tx_begin() fail\n”);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

exit(1);

}

strcpy(sndbuf, argv[1]);

cd = tpenq_ctl(“txrq1”, “TOUPPER”, ctl, (char *)sndbuf, 0, TPRQS );

if (cd < 0) {

printf(“tpenq failed [%s]\n”, tpstrerror(tperrno));

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

cd = tpenq_ctl(“txrq1”, “TOUPPER”, ctl, (char *)sndbuf, 0, TPRQS );

if (cd < 0) {

printf(“tpenq failed [%s]\n”, tpstrerror(tperrno));

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

data process....

ret = tx_commit();

if(ret < 0)

{

fprintf(stderr, “tx_commit() fail\n”);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tx_rollback();

exit(1);

}

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

제3장 API 33

Page 48: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

● 관련 함수

tpdeq_ctl(), tpqstat()

3.9. tpdeq_ctl서버/클라이언트에서 트랜잭션을 지원하며 RQ로부터 데이터를 로드하는 함수이다. tpenq_ctl() 를 이용

하여 서비스를 요청한 결과나 서비스명을 NULL로 해서 저장한 데이터를 읽는 함수이다. tpenq_ctl() 할 때

flags에 TPNOREPLY를 설정한 서비스는 결과를 받을 수 없다.

tpdnq_ctl() 함수는 트랜잭션 모드에서 수행하면, 데이터를 RQ에서 로드하는 동안 트랜잭션으로 처리된

다. 2번 이상의 tpdep_ctl()을 하나의 트랜잭션으로 묶은 경우 모든 데이터가 RQ에서 데이터를 로드하는

도중 에러가 발생하면 롤백된다.

● 프로토타입

#include <usrinc/tmaxapi.h>

int tpdeq_ctl(char *qname, char *svc, TMQCTL *ctl, char **data,

long *len, long flags);

● 파라미터

설명파라미터

데이터를 저장할 RQ의 이름으로 환경파일에 등록된 이름이어야 한다.qname

tpenq_ctl() 호출하는 경우 svc에 전달한 이름이어야 한다.svc

서비스명으로 tpenq_ctl()를 호출한 경우, 서비스가 자동 요청되고, 결과가

RQ에 저장된다. 이 때 서비스 결과를 받기 위해서는 tpdeq_ctl()도 동일한 서

비스명을 입력한다.

서비스명을 NULL로 tpenq_ctl()를 호출한 경우, tpdeq_ctl()도 서비스명을

NULL로 한다. 서비스명이 NULL인 경우 서비스명에 상관없이 큐에 쌓여있는

모든 데이터를 하나씩 deq할 수 있다.

tpenq_ctl() 함수가 에러나 시스템 장애로 인해 Fail 큐에 저장된 데이터를

tpdeq_ctl()하기 위해서는 svc에 _rq_sub_queue_name [TMAX_FAIL_QUEUE]

를 주고 deq해야 한다.

반드시 이전에 tpalloc()에 의해 할당된 버퍼에 대한 포인터이어야 한다.data

tpdeq_ctl() 가 성공적으로 수행된 경우 수신된 데이터가 저장된다.

tpdeq_ctl()가 성공적으로 수신한 데이터의 길이이다. tpdeq_ctl()는 필요하다

면 응답 내용이 지정된 버퍼에 수신될 수 있도록 버퍼 크기를 증가시킨다.

len

*data는 수신 데이터가 커서 변경 될 수도 있고, 이 외에 다른 이유에 의해서

34 Tmax Programming Guide (RQ)

Page 49: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명파라미터

도 변경될 수 있다. 만약 len이 호출 전 버퍼의 총 크기보다 크다면 len이 그

버퍼의 새로운 크기가 된다.

len이 0으로 반환되었다면, 어떤 데이터도 수신되지 않고 *data와 len이 지시

하는 버퍼 모두 아무런 변화가 없다. *data나 len이 NULL이 되는 것은 에러이

다음은 flags로 사용 가능한 값에 대한 설명이다.

설명설정값

RQ에서 data를 가져올 때 사용된다. Reply 큐로부터 서비스의 결과를 가져

오기 위해서 설정된다.

TPRQS

서비스별 RQ data를 관리할 때 사용한다.TPFUNC

TPFUNC 플래그가 설정 되지 않았다면 처음 tpenq()를 통해 저장된 데이터

가 제거(dequeued)된다. 데이터가 저장되기 전에 해야할 경우에는 tpenq()를

호출할 때 TPFUNC를 같이 설정한다.

tpdeq_ctl()를 호출할 때 블럭 타임아웃 시간동안 메시지가 올 때까지 기다린

다.

TPBLOCK

TPBLOCK과 함께 사용되면 블럭 타임아웃 시간에 관계 없이 응답이 올 때까

지 기다린다.

TPNOTIME

0(zero) 플래그는 데이터를 자신이 접속한 클라이언트의 버퍼에서 가져오고

자 할 때 사용한다.

0(zero)

● 반환값

설명반환값

함수 호출에 실패한 경우-1

(tperrno에 에러 상황에 해당하는 값이 설정된다.)

● 오류

tpdeq_ctl() 실패하는 경우 상황에 따라 tperrno에 다음 에러 값들이 설정된다.

설명에러 코드

인수가 유효하지 않다.[TPEINVAL]

예를 들어, 데이터가 tpalloc()으로 할당되지 않은 버퍼를 가리키거나 또는

flags가 유효하지 않다.

제3장 API 35

Page 50: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

설명에러 코드

TPSIGRSTRT가 설정되지 않은 상태에서, 시그널이 수신되었다.[TPGOTSIG]

서비스 이름이 잘못 되었거나 해당 조건을 만족하는 데이터를 찾지 못했다.[TPEMATCH]

존재하지 않는 qname이 사용되었다.[TPENOENT]

tpdeq_ctl()이 부적절한 상황에서 호출되었다.[TPEPROTO]

Tmax 시스템 에러가 발생하였다. 자세한 정보는 로그파일에 기록된다.[TPESYSTEM]

운영 시스템에 에러가 발생하였다.[TPEOS]

● 예제

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

main(int argc, char *argv[])

{

char *sndbuf, *rcvbuf;

long rcvlen, sndlen, revent;

int ret, i, cd;

TMQCTL *ctl;

ctl = (TMQCTL*)malloc(sizeof(TMQCTL));

memset(ctl, 0, sizeof(TMQCTL));

if (argc != 2) {

printf(“Usage: toupper_rq string\n”);

exit(1);

}

if ( (ret = tmaxreadenv( “tmax.env”,”TMAX” )) == -1 ){

printf( “tmax read env failed\n” );

exit(1);

}

if (tpstart((TPSTART_T *)NULL) == -1){

printf(“tpstart failed\n”);

exit(1);

}

if ((sndbuf = (char *)tpalloc(“STRING”, NULL, 0)) == NULL) {

printf(“sendbuf alloc failed !\n”);

tpend();

36 Tmax Programming Guide (RQ)

Page 51: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

exit(1);

}

if ((rcvbuf = (char *)tpalloc(“STRING”, NULL, 0)) == NULL) {

printf(“recvbuf alloc failed !\n”);

tpfree((char *)sndbuf);

tpend();

exit(1);

}

ret = tx_begin();

if(ret < 0)

{

fprintf(stderr, “tx_begin() fail\n”);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

exit(1);

}

strcpy(sndbuf, argv[1]);

cd = tpdeq_ctl(“txrq1”, “TOUPPER”, ctl, &rcvbuf, &rcvlen, TPRQS );

if (cd < 0)

{

printf(“tpdeq failed [%s]\n”, tpstrerror(tperrno) );

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

cd = tpdeq_ctl(“txrq1”, “TOUPPER”, ctl, &rcvbuf, &rcvlen, TPRQS );

if (cd < 0)

{

printf(“tpdeq failed [%s]\n”, tpstrerror(tperrno) );

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

exit(1);

}

data process....

ret = tx_commit();

if(ret < 0)

{

fprintf(stderr, “tx_commit() fail\n”);

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

제3장 API 37

Page 52: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

tx_rollback();

exit(1);

}

tpfree((char *)sndbuf);

tpfree((char *)rcvbuf);

tpend();

}

● 관련 함수

tpenq_ctl(), tpqstat()

38 Tmax Programming Guide (RQ)

Page 53: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

제4장 예제

4.1. 기본RQ 프로그램의 동작은 기본적으로 비동기형 통신과 유사하다. 클라이언트는 tpenq()로 서비스를 호출하

며 tpdeq()로 결과값을 받아온다. tpenq()의 플래그를 TPNOFLAGS로 주었을 경우 이 과정은 거의 동일하

다. 에러가 발생할 경우의 과정은 “3.1. tpenq”을 참고한다.

tpenq()의 플래그가 TPNOFLAGS가 아닐 경우 서비스 결과값은 클라이언트가 아닌 서버 측의 RQ 데이터

파일에 저장된다. 즉 클라이언트는 서비스 수행의 완료를 tpsleep()등을 통해 확인할 수 없다. 개발자는 서

비스 완료의 시점을 알아야 할 필요가 있다면 TPNOFLAGS를 설정하여 사용하거나 또는 다른 API들을

이용하여 구현할 수 있다.

TPNOFLAGS 이외의 플래그를 사용할 경우 서버에서 넘겨주는 urcode 값은 무시된다.

참고

자세한 내용은 Tmax 안내서 중 "Tmax Reference Guide"를 참고한다.

4.1.1. 기본적인 작동

RQ 시스템을 사용하는 가장 기본적인 형태의 프로그램으로 클라이언트는 하나의 RQ를 이용하여 tpenq()

로 서비스를 호출하고 tpdeq()로 결과값을 받아온다.

아래의 예제는 클라이언트가 tpenq()와 tpdeq()를 이용해서 서비스 결과를 받아오는 기초적인 RQ프로그

램이다. 서비스 이름을 명시하고 플래그는 TPRQS를 사용했으며 클라이언트는 tpqstat()을 사용하여 replay

큐에 적재되어 있는 결과 데이터들을 읽어온다. 서비스 이름을 명시하여 RQ를 사용할 경우 서비스의 스

케줄링은 각각의 서비스별로 실행되며 tpenq()로 저장된 순서와는 다를 수 있다.

제4장 예제 39

Page 54: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

[그림 4.1] tpenq를 서비스 명으로 호출

Tmax 환경파일

*DOMAIN

tmax SHMKEY=88000,

TPORTNO = 8888

*NODE

tmax1 TMAXDIR="/user1/tmax",

APPDIR="/user1/tmax/appbin"

*SVRGROUP

svg1 NODENAME = tmax1,

CPC = 4,

SVGTYPE=RQMGR

*RQ

rqtest SVGNAME = svg1

*SERVER

svr SVGNAME = svg1

*SERVICE

SERVICE SVRNAME = svr

40 Tmax Programming Guide (RQ)

Page 55: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

클라이언트 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

int main(int argc, char *argv[])

{

char *buf;

long rlen;

int rqcount, i;

if (argc != 2){

error procesing

}

if (tpstart((TPSTART_T *)NULL) == -1){

error processing

}

buf = tpalloc("CARRAY", NULL, 0);

if (buf == NULL){

error processing

}

strcpy(buf, argv[1]);

if (tpenq("rqtest", "SERVICE", buf, strlen(buf), TPRQS) == -1){

error processing

}

...

rqcount = tpqstat("rqtest", TMAX_RPLY_QUEUE);

for(i = 0;i < rqcount;i++){

...

if(tpdeq("rqtest", "SERVICE", &buf, &rlen, TPRQS) == -1){

error processing

}

...

}

tpfree((char *)buf);

tpend();

}

제4장 예제 41

Page 56: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

서버 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

SERVICE(TPSVCINFO *msg)

{

int i;

...

tpreturn(TPSUCCESS,0,(char *)msg->data, 0,TPNOFLAGS);

}

4.1.2. RQ 트랜잭션

신뢰성 큐(RQ)를 사용하여 통신할 경우 트랜잭션을 지원하지 않았으나, SP2 에서 신뢰성 큐(RQ)를 사용

하는 경우에도 트랜잭션을 지원하도록 하였다.

환경설정

SVGTYPE를 TXRQMGR로 설정한다.

SVRGROUP_이름 SVGTYPE = TXRQMGR

다음은 환경 설정의 예제이다.

*SVRGROUP

Txrqsvg NODENAME = tmaxh4, SVGTYPE = TXRQMGR, CPC = 4

주의사항은 다음과 같다.

● RQ 서버 그룹의 TYPE 을 RQMGR 대신 TXRQMGR 로 설정해야 한다.

● 기존의 tpenq/tpdeq API 는 트랜잭션이 지원되지 않는다.

● tpenq_ctl과 tpdeq_ctl은 하나의 트랜잭션으로 묶일 수 없다.

● tpenq_ctl를 트랜잭션 묶는 경우 RQ에 저장하는 과정까지만 트랜잭션으로 처리한다. svc call에 대해서

는 트랜잭션을 지원하지 않는다.

● deq_time을 설정한 경우, 설정시간 이후에 svc call을 하게 된다. 현재 시간 + delay_time 으로 설정해야

한다. 예) delay_time 을 10으로 주고 싶은 경우: time(&t); ctl->deq_time = t + 10;

● deq_time은 트랜잭션과 함께 사용할 수 없다.

42 Tmax Programming Guide (RQ)

Page 57: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

4.2. 응용tpenq() – tpdeq() 라는 간단한 구조의 RQ 프로그램도 Tmax의 다양한 프로세스 관리유형을 이용하여 개

발한다면 그 사용 범위가 무척 다양해진다. 본 절에서는 Tmax의 독자적인 방식인 UCS 방식을 이용한 다

양한 프로그래밍 기법을 소개한다.

4.2.1. UCS를 사용한 RQ

클라이언트가 요청하는 일련의 작업들이 순서대로 수행되어야 할 필요가 있고 각 서버 프로그램의 수행

시간이 길 경우 클라이언트는 전체 서비스 기간 동안 블록 상태로 기다려야 한다. 하지만 RQ를 이용한다

면 클라이언트는 원하는 서비스 내용을 RQ에 저장하고 바로 다음 작업을 할 수 있으며 서버에서는 서비

스 요청 내용을 RQ로부터 순서대로 읽어서 수행할 수 있다.

클라이언트에서 원하는 서비스명과 데이터를 구조체에 저장하여 여러번 tpenq()를 하며 이때 서비스 이름

은 NULL을 준다. 이 데이터들은 Reply 큐에 쌓이게 되며 UCS 서버에서는 여기에서 데이터를 읽어 해당

서비스로 데이터를 보내 서비스를 호출한다.

[그림 4.2] tpenq를 NULL로 호출

Tmax 환경파일

*DOMAIN

tmax SHMKEY=88000,

TPORTNO = 8888

*NODE

tmax1 TMAXDIR="/user1/tmax",

APPDIR="/user1/tmax/appbin"

제4장 예제 43

Page 58: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

*SVRGROUP

svg1 NODENAME = tmax1,

CPC = 4,

SVGTYPE=RQMGR

*RQ

rqenq SVGNAME = svg1

rqdeq SVGNAME = svg1

*SERVER

svr1 SVGNAME = svg1

svr2 SVGNAME = svg1,

SVRTYPE = UCS

*SERVICE

SERVICE1 SVRNAME = svr1

SERVICE2 SVRNAME = svr1

SERVICE3 SVRNAME = svr1

클라이언트 프로그램

#include <stdio.h>

#include <sys/time.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

#include “../sdl/demo.s”

int main(int argc, char *argv[])

{

struct *buf1, *buf2, *buf3

long rlen;

int rqcount, i;

struct timeval tval;

if (argc != 4){

error processing

}

if (tpstart((TPSTART_T *)NULL) == -1){

error processing

}

buf1 = (struct rqsvc *)tpalloc("STRUCT", “rqsvc”, 0);

buf2 = (struct rqsvc *)tpalloc("STRUCT", “rqsvc”, 0);

buf3 = (struct rqsvc *)tpalloc("STRUCT", “rqsvc”, 0);

44 Tmax Programming Guide (RQ)

Page 59: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

if (buf1 == NULL || buf2=NULL || buf3==NULL){

error processing

}

strcpy(buf1->svc, “SERVICE1”);

strcpy(buf1->data, argv[1]);

strcpy(buf2->svc, “SERVICE2”);

strcpy(buf2->data, argv[2]);

strcpy(buf3->svc, “SERVICE3”);

strcpy(buf3->data, argv[3]);

/*서비스 명을 NULL로 주어 Reply 큐에 데이터를 송신한다.*/

if (tpenq("rqenq", NULL, buf1, 0, TPRQS) == -1){

error processing

}

if (tpenq("rqenq", NULL, buf2, 0, TPRQS) == -1){

error processing

}

if (tpenq("rqenq", NULL, buf3, 0, TPRQS) == -1){

error processing

}

tpfree((char *)buf1);

tpfree((char *)buf2);

tpfree((char *)buf3);

tpend();

}

서버 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/ucs.h>

#include <usrinc/tmaxapi.h>

#include “../sdl/demo_sdl.h”

int usermain(int argc, char *argv[])

{

struct rqsvc *buf;

char *sndbuf;

long rlen;

int count, i, ret;

buf = (struct rqsvc *)tpalloc("STRUCT", “rqsvc”, 0);

if (buf == NULL){

error processing

제4장 예제 45

Page 60: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

}

sndbuf = tpalloc("STRING", NULL, 0);

if (sndbuf == NULL){

error processing

}

while(1){

tpschedule(10);

/*Reply 큐의 데이터 갯수를 알아낸다.*/

count = tpqstat("rqenq", TMAX_RPLY_QUEUE);

printf("count = %d\n", count);

for (i = 0; i < count ; i++){

/*Reply 큐에 있는 데이터를 중 서비스 명이 NULL인 데이터를 */

/*송신한다.*/

if (tpdeq("rqenq", NULL, (char **)&buf, &rlen, TPRQS) == -1){

error processing

}

buf=(struct rqsvc *)buf;

strcpy(sndbuf, buf->data);

/*순차적으로 서비스를 수행한다.*/

if (tpcall(buf->svc, sndbuf, 0, (char **)&buf, (long *)&rlen,

TPNOFLAGS) == -1){

error processing

}

...

}

}

return 1;

}

4.2.2. Fail 큐 복구

여러가지 원인으로 발생한 Fail 큐의 데이터는 상황에 따라 적절한 방식으로 처리해 주어야 한다. 가장 간

단하게는 관리툴을 이용하여 큐의 내용을 지우는 방법도 있지만(“2.2.2. 상태 정보 관리”를 참고) 사용자가

원하는 방식으로 처리해 주고 싶다면 이를 대행하는 프로그램을 만들어야 한다.

아래의 예제는 UCS방식의 프로그램으로 10초 간격으로 Fail 큐의 데이터를 읽어 들이며 tpextsvcname()

으로 해당하는 서비스를 찾은후 특정 서비스의 데이터는 파기하고 나머지는 다시 해당 서비스의 Request

큐로 넣어준다. tpreissue() 는 데이터를 읽어서 해당 서비스로 보내는 과정을 한번에 해 주지만 위와 같이

상황에 따라 다른 행동을 하는 경우는 사용할 수 없다.

46 Tmax Programming Guide (RQ)

Page 61: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

[그림 4.3] Fail 큐 복구

Tmax 환경파일

*DOMAIN

tmax SHMKEY=88000,

TPORTNO = 8888

*NODE

tmax1 TMAXDIR="/user1/tmax",

APPDIR="/user1/tmax/appbin"

*SVRGROUP

svg1 NODENAME = tmax1,

CPC = 4,

SVGTYPE=RQMGR

*RQ

rqtest SVGNAME = svg1, BOOT = WARM

*SERVER

svr1 SVGNAME = svg1

svr2 SVGNAME = svg1

svr3 SVGNAME = svg1,

SVRTYPE = UCS

제4장 예제 47

Page 62: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

*SERVICE

SERVICE1 SVRNAME = svr1

SERVICE2 SVRNAME = svr2

STOP SVRNAME = svr2

서버 프로그램

#include <stdio.h>

#include <usrinc/atmi.h>

#include <usrinc/tmaxapi.h>

int usermain(int argc, char *argv[])

{

char *buf, svcname[16];

long rlen;

int failcount, i, ret;

buf = tpalloc("STRING", NULL, 0);

if (buf == NULL){

error processing

}

while(1){

tpschedule(10);

/*Fail 큐의 갯수를 알아낸다.*/

failcount = tpqstat("rqtest", TMAX_FAIL_QUEUE);

for (i = 0; i < failcount ; i++){

/*Fail 큐의 데이터를 수신한다.*/

if (tpdeq("rqtest", _rq_sub_queue_name[TMAX_FAIL_QUEUE], &buf, &rlen,

TPRQS) == -1){

error processing

}

/*서비스 명을 알아온다.*/

if (tpextsvcname(buf, svcname) == -1){

error processing

}

/* 읽어온 데이터가 “STOP” 서비스 이면 skip한다. */

if (strcomp(svcname, “STOP”)) {

/*해당 서비스 명으로 tpenq 한다.*/

ret=tpenq("rqtest", svcname, buf, rlen, TPRQS);

if (ret<0) {

error processing

}

}

}

}

48 Tmax Programming Guide (RQ)

Page 63: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

return 1;

}

제4장 예제 49

Page 64: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에
Page 65: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

Appendix A. 헤더파일

좀더 자세한 정보를 원하는 사용자를 위해 RQ API들의 원형과 시스템 변수를 선언한 헤더파일의 내용을

예시하였다. Tmax가 제공하는 헤더 파일들은 TMAXDIR/usrinc 에 위치한다.

A.1. tmaxapi.h

/* --------------- usrinc/tmaxapi.h ------------------*/

/* */

/* Copyright (c) 2000 TmaxSoft Co., Ltd */

/* All Rights Reserved */

/* */

/* ---------------------------------------------------*/

#ifndef _TMAXAPI_H

#define _TMAXAPI_H

#include <sys/types.h>

#include <usrinc/atmi.h>

#ifdef _WIN32

#include <winsock2.h>

#include <usrinc/svct.h>

#include <usrinc/sdl.h>

#else

#include <sys/socket.h>

#define __cdecl

#endif

/* client logout type */

#define CLIENT_CLOSE_NORMAL 0

#define CLIENT_CLOSE_ABNORMAL 1

#define CLIENT_PRUNED 2

/* RQ Sub-queue type */

#define TMAX_ANY_QUEUE 0

#define TMAX_FAIL_QUEUE 1

#define TMAX_REQ_QUEUE 2

#define TMAX_RPLY_QUEUE 3

#define TMAX_MAX_QUEUE 4

extern char

Appendix A. 헤더파일 51

Page 66: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

_rq_sub_queue_name[TMAX_MAX_QUEUE][XATMI_SERVICE_NAME_LENGTH];

/* RQ related macros */

#define RQ_NAME_LENGTH 16

/* unsolicited msg type */

#define UNSOL_TPPOST 1

#define UNSOL_TPBROADCAST 2

#define UNSOL_TPNOTIFY 3

#define UNSOL_TPSENDTOCLI 4

/* Check SVCINFO cmds */

#define ISSVC_FORWARDED 0x00000001

#define ISSVC_NOREPLY 0x00000002

/* TPEVCTL ctl_flags */

#define TPEV_SVC 0x00000001

#define TPEV_PROC 0x00000002

struct tpevctl {

long ctl_flags;

long post_flags;

char svc[XATMI_SERVICE_NAME_LENGTH];

char qname[RQ_NAME_LENGTH];

};

typedef struct tpevctl TPEVCTL;

typedef void __cdecl Unsolfunc(char *, long, long);

#define TPUNSOLERR ((Unsolfunc *) -1)

/* Multicast call related structures */

struct svglist {

int ns_entry; /* number of entries of s_list */

int nf_entry; /* number of entries of f_list */

int *s_list; /* list of server group numbers */

int *f_list; /* list of server group numbers */

};

#if defined (__cplusplus)

extern "C" {

#endif

/* ----- unsolicited messaging API ----- */

long __cdecl tpsubscribe(char *eventexpr, char *filter, TPEVCTL *ctl,

long flags);

int __cdecl tpunsubscribe(long sd, long flags);

int __cdecl tppost(char *eventname, char *data, long len,

52 Tmax Programming Guide (RQ)

Page 67: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

long flags);

int __cdecl tpbroadcast(char *lnid, char *usrname, char *cltname, char *data,

long len, long flags);

Unsolfunc *__cdecl tpsetunsol(Unsolfunc *func);

int __cdecl tpsetunsol_flag(int flag);

int __cdecl tpgetunsol(int type, char **data, long *len, long flags);

int __cdecl tpclearunsol(void);

/* ----- RQS API -------- */

int __cdecl tpenq(char *qname, char *svc, char *data, long len, long flags);

int __cdecl tpdeq(char *qname, char *svc, char **data, long *len, long flags);

int __cdecl tpqstat(char *qname, long type);

int __cdecl tpqsvcstat(char *qname, char *svc, long type);

int __cdecl tpextsvcname(char *data, char *svc);

int __cdecl tpextsvcinfo(char *data, char *svc, int *type, int *errcode);

int __cdecl tpreissue(char *qname, char *filter, long flags);

char *__cdecl tpsubqname(int type);

/* ----- server API -------- */

int __cdecl tpgetminsvr(void);

int __cdecl tpgetmaxsvr(void);

int __cdecl tpgetmaxuser(void);

int __cdecl tpgetsvrseqno(void);

int __cdecl tpgetmysvrid(void);

int __cdecl tpgetmaxuser(void);

int __cdecl tpsendtocli(int clid, char *data, long len, long flags);

int __cdecl tpgetclid(void);

int __cdecl tpgetpeer_ipaddr(struct sockaddr *name, int *namelen);

int __cdecl tpchkclid(int clid);

int __cdecl tmax_clh_maxuser(void);

int __cdecl tmax_chk_svcinfo(int cmd);

/* ----- etc API ----------- */

int __cdecl tp_sleep(int sec);

int __cdecl tp_usleep(int usec);

int __cdecl tpset_timeout(int sec);

int __cdecl tmaxreadenv(char *file, char *label);

char *__cdecl tpgetenv(char* str);

int __cdecl tpputenv(char* str);

int __cdecl tpgetsockname(struct sockaddr *name, int *namelen);

int __cdecl tpgetpeername(struct sockaddr *name, int *namelen);

int __cdecl tpgetactivesvr(char *nodename, char **outbufp);

int __cdecl tperrordetail(int i);

int __cdecl tpreset(void);

int __cdecl tptobackup();

struct svglist *__cdecl tpmcall(char *qname, char *svc, char *data, long len,

long flags);

Appendix A. 헤더파일 53

Page 68: Tmax Programming Guide (RQ) · 2019. 4. 9. · Tmax RQ 시스템은 특별한 Raw Device를 사용하지 않는다. RQ 시스템이 기동되면 Tmax는 사용자가 지 정한 디렉터리에

struct svglist *__cdecl tpgetsvglist(char *svc, long flags);

int __cdecl tpsvgcall(int svgno, char *qname, char *svc, char *data, long len,

long flags);

int __cdecl tpflush();

char *__cdecl tmaxlastsvc(char *idata, char *odata, long flags);

#ifndef _TMAX_KERNEL

/* ------- User supplied routines ---------- */

int __cdecl tpsvrinit(int argc, char *argv[]);

int __cdecl tpsvrdone();

void __cdecl tpsvctimeout(TPSVCINFO *msg);

#endif

/*

Internal functions: ONLY BE CALLED FROM AUTOMATICALLY

GENERATED STUB FILES. DO NOT DIRECTLY CALL THESE FUNCTIONS.

*/

int __cdecl get_clhfd(void);

#if defined(_WIN32)

int __cdecl _tmax_regfn(void *initFn, void *doneFn, void *timeoutFn,

void *userMainFn);

int __cdecl _tmax_regtab(int svcTabSz, _svc_t *svcTab, int funcTabSz,

void *funcTab);

int __cdecl _tmax_regsdl(int _sdl_table_size2, struct _sdl_struct_s *_sdl_table2,

int _sdl_field_table_size2, struct _sdl_field_s *_sdl_field_table2);

int __cdecl _tmax_main(int argc, char *argv[]);

int __cdecl _double_encode(char *in, char *out);

int __cdecl _double_decode(char *in, char *out);

#endif

#if defined (__cplusplus)

}

#endif

#endif /* end of _TMAXAPI_H */

54 Tmax Programming Guide (RQ)