OpenTP1 メッセージキューイング機能 TP1/Message Queue 使用の手引
製品が提供するサンプルコードを使用したシステム構成例について説明します。
サンプルコードのシステム構成
製品が提供するサンプルコードは,ホスト1とホスト2,およびホスト1とホスト3とでメッセージを送受信するシステム構成です。
サンプルコードのシステム構成について,次の図に示します。
図4-4 サンプルコードのシステム構成
このシステム構成でのホスト1,ホスト2,およびホスト3の定義コーディング例を次に示します。
#
# Message Queue Access service definition(mqa)
#
set mqa_max_quenum = 20
set mqa_max_grpnum = 10
set mqa_max_filnum = 10
set mqa_max_msg_recnum = 5
set mqa_ioproc_num = 3
# queue file group definition
mqaquegrp -g sendgroup1 -n 256 \
/BeTRAN/examples/mq/mqfile1/sendqf1
mqaquegrp -g sendgroup2 -n 256 \
/BeTRAN/examples/mq/mqfile1/sendqf2
mqaquegrp -g recvgroup1 -n 256 \
/BeTRAN/examples/mq/mqfile2/recvqf1
mqaquegrp -g recvgroup2 -n 256 \
/BeTRAN/examples/mq/mqfile2/recvqf2
mqaquegrp -g initgroup1 -n 128 \
/BeTRAN/examples/mq/mqfile3/initqf1
# local definition of remote queue
mqaremque -r dynq1 -m qmgr2 -x trnq1 rmtq1
mqaremque -r dynq1 -m qmgr3 -x trnq2 rmtq2
# process definition
mqaprcdef -p PRC1 -t 15 -e ENV1 -u USER1 prc1
# queue manager definition
mqaquemgr -n qmgr1 -q QMGR1 -t 0 -p 9 \
-h 128 -l 5000000 -s sync
#mqt definition
mqamqtnam _mqtd1 mqttcp 2
mqamqtnam _mqtd2 mqttcp 2
#
# MQT communication configuration definition, tcp definition
#
# tcp configuration definition
mqttcp -i iniq1 \
-p tcp \
-g "rcvbuf = 3" \
-r "servname = mqhost1_sv1" \
-v "itim = 60 \
etim = 40 \
rtim = 60" \
-t "disk = yes \
bufcnt = 100 \
trccnt = 3" \
-z event
# sender channel definition
mqtalccha -c CHA01 \
-y "type = sender" \
-j 50 \
-q trnq1 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999 \
-g "sndbuf = 1 \
buftype=msg" \
-i auto \
-b "bretry = yes \
bretrycnt = 10 \
bretryint = 60 \
bretrylg = yes \
bretrylgcnt = 999999999 \
bretrylgint = 1200 \
bretrymcp = yes" \
-r "servname = mqhost1_sv3" \
-o "ohostname = mqhost2 \
oservname = mqhost2_sv1" \
-v "tim1 = 30 \
tim2 = 30 \
dtimefct = yes \
dtim = 60 \
vretry = yes \
htim = 15 \
btim = 0" \
-t "tretrycnt = 10 \
tretryint = 1" \
-s "npmspeed = fast" \
-z event \
-h 'to mqhost2'
mqtalced
# receiver channel definition
mqtalccha -c CHA02 \
-y "type = receiver" \
-j 50 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999 \
-g "rcvbuf = 2 \
buftype = msg" \
-i auto \
-v "tim3 = 10 \
htim = 15 \
mtim = 10" \
-s "npmspeed = fast" \
-f "adoptchk = qmgr" \
-h 'from mqhost2'
mqtalced
#
# MQT communication configuration definition, tcp definition
#
# tcp configuration definition
mqttcp -p tcp \
-g "rcvbuf = 3" \
-r "servname = mqhost1_sv2" \
-v "etim = 40 \
rtim = 60" \
-t "disk = yes \
bufcnt = 100 \
trccnt = 3"
# server channel definition
mqtalccha -c CHA03 \
-y "type = server" \
-j 50 \
-q trnq2 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999 \
-g "sndbuf = 1 \
buftype=msg" \
-i auto \
-v "tim2 = 30 \
dtimefct = yes \
dtim = 60 \
htim = 15 \
btim = 0" \
-s "npmspeed = fast" \
-z event \
-f "adoptchk = qmgr" \
-h 'from mqhost3'
mqtalced
# requester channel definition
mqtalccha -c CHA04 \
-y "type = requester" \
-j 50 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999 \
-g "rcvbuf = 2 \
buftype = msg" \
-i auto \
-b "bretry = yes \
bretrycnt = 10 \
bretryint = 60 \
bretrylg = yes \
bretrylgcnt = 999999999 \
bretrylgint = 1200 \
bretrymcp = yes" \
-o "ohostname = mqhost3 \
oservname = mqhost3_sv1" \
-v "tim1 = 30 \
tim3 = 10 \
vretry = yes \
htim = 15 \
mtim = 10" \
-t "tretrycnt = 10 \
tretryint = 1" \
-s "npmspeed = fast" \
-h 'to mqhost3'
mqtalced
#
# MQT communication configuration definition, tcp definition
#
# tcp configuration definition
mqttcp -i iniq1 \
-p tcp \
-g "rcvbuf = 3" \
-r "servname = mqhost2_sv1" \
-v "itim = 60 \
etim = 40 \
rtim = 60" \
-t "disk = yes \
bufcnt = 100 \
trccnt = 3" \
-z event
# receiver channel definition
mqtalccha -c CHA01 \
-y "type = receiver" \
-j 50 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999 \
-g "rcvbuf = 2 \
buftype = msg" \
-i auto \
-v "tim3 = 10 \
htim = 15 \
mtim = 10" \
-s "npmspeed = fast" \
-f "adoptchk = qmgr" \
-h 'from mqhost1'
mqtalced
# sender channel definition
mqtalccha -c CHA02 \
-y "type = sender" \
-j 50 \
-q trnq1 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999 \
-g "sndbuf = 1 \
buftype=msg" \
-i auto \
-b "bretry = yes \
bretrycnt = 10 \
bretryint = 60 \
bretrylg = yes \
bretrylgcnt = 999999999 \
bretrylgint = 1200 \
bretrymcp = yes" \
-o "ohostname = mqhost1 \
oservname = mqhost1_sv1" \
-v "tim1 = 30 \
tim2 = 30 \
dtimefct = yes \
dtim = 60 \
vretry = yes \
htim = 15 \
btim = 0" \
-t "tretrycnt = 10 \
tretryint = 1" \
-s "npmspeed = fast" \
-z event \
-h 'to mqhost1'
mqtalced#
# MQT communication configuration definition, tcp definition
#
# tcp configuration definition
mqttcp -p tcp \
-g "rcvbuf = 3" \
-r "servname = mqhost3_sv1" \
-v "etim = 40 \
rtim = 60" \
-t "disk = yes \
bufcnt = 100 \
trccnt = 3"
# requester channel definition
mqtalccha -c CHA03 \
-y "type = requester" \
-j 50 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999\
-g "rcvbuf = 2 \
buftype = msg" \
-i auto \
-b "bretry = yes \
bretrycnt = 10 \
bretryint = 60 \
bretrylg = yes \
bretrylgcnt = 999999999 \
bretrylgint = 1200 \
bretrymcp = yes" \
-r "servname = mqhost3_sv2" \
-o "ohostname = mqhost1 \
oservname = mqhost1_sv2" \
-v "tim1 = 30 \
tim3 = 10 \
vretry = yes \
htim = 15 \
mtim = 10" \
-t "tretrycnt = 10 \
tretryint = 1" \
-s "npmspeed = fast" \
-h 'to mqhost1'
mqtalced
# server channel definition
mqtalccha -c CHA04 \
-y "type = server" \
-j 50 \
-q trnq1 \
-m "maxmsg = 8192 \
maxseg = 4096" \
-w 999999999 \
-g "sndbuf = 1 \
buftype=msg" \
-i auto \
-v "tim2 = 30 \
dtimefct = yes \
dtim = 60 \
htim = 15 \
btim = 0" \
-s "npmspeed = fast" \
-z event \
-f "adoptchk = qmgr" \
-h 'from mqhost1'
mqtalcedメッセージを登録するアプリケーションの例
ホスト1上で動作するアプリケーションmqputは,転送キューtrnq1およびtrnq2にメッセージを登録します。転送キューtrnq1に登録されたメッセージはチャネルCHA01を経由してホスト2に送信されます。転送キューtrnq2に登録されたメッセージはチャネルCHA03を経由してホスト3に送信されます。
メッセージを登録するアプリケーションの例について,次の図に示します。
図4-5 メッセージを登録するアプリケーションの例
アプリケーションmqputのコーディング例(C言語)を次に示します。
0010 /********************************************************
0020 ** mqput_c.c
0030 ** specification
0040 ** functions = main()
0050 ********************************************************/
0060
0070 /********************************************************
0080 ** name = main()
0090 ** func = main function of UAP
0100 ** (1)start UAP(output start message)
0110 ** (2)MQCONN(Connect queue manager)
0120 ** (3)MQOPEN(Open queue)
0130 ** (4)MQPUT(Put message)
0140 ** (5)MQCLOSE(Close queue)
0150 ** (6)MQDISC(Disconnect queue manager)
0160 ** (7)finish UAP(output end message)
0170 ** arg = nothing
0180 ** return = void
0190 ** note =
0200 ********************************************************/
0210 #ifdef TP1MQ_NT
0220 #include <windows.h>
0230 #endif
0240 #include <stdio.h>
0250 #include <string.h>
0260 #include <stdlib.h>
0270 #include <cmqc.h>
0280 #include <dcrpc.h>
0290 #include <dcadm.h>
0300 #include <dctrn.h>
0310
0320 static char *Mid = "%Z% %M%(%E% %U%)-%I% " ;
0330
0340 #define PUT_DATA "******** sample put data0 ********"
0350
0360 void main()
0370 {
0380 MQCHAR48 QueueManager=" "; /* queue manager name */
0390 MQCHAR message_data[100]; /* message data */
0400 MQHCONN qm_handle; /* connection handle */
0410 MQHOBJ que_handle[2]; /* object handle */
0420 MQLONG comp_code; /* completion code */
0430 MQLONG reason; /* reason code */
0440 MQLONG buffer_length; /* buffer length */
0450 MQLONG rcd; /* return code */
0460 MQOD obj_desc0 = { MQOD_DEFAULT };
0470 /* message discriptor */
0480 MQOD obj_desc1 = { MQOD_DEFAULT };
0490 /* message discriptor */
0500 MQMD msg_desc = { MQMD_DEFAULT };
0510 /* object discriptor */
0520 MQPMO put_options = { MQPMO_DEFAULT };
0530 /* put message options */
0540 int flags = 0;
0550 int loop_cnt;
0560 char que_name[][49] =
0570 {"rmtq1", "rmtq2"}; /* que name */
0580
0590 /* Start of UAP */
0600 rcd = dc_rpc_open(DCNOFLAGS);
0610 if (rcd != DC_OK) {
0620 printf(
0630 "mqput_c : Failed at dc_rpc_open. CODE = %d \n",
0640 rcd);
0650 goto PROG_END;
0660 }
0670
0680 /* post the completion of user process start
0690 processing */
0700 rcd = dc_adm_complete(DCNOFLAGS);
0710 if (rcd != DC_OK) {
0720 printf(
0730 "mqput_c : Failed at dc_adm_complete. CODE = %d \n",
0740 rcd);
0750 goto PROG_END;
0760 }
0770
0780 /* Connect queue manager */
0790 MQCONN(QueueManager, &qm_handle, &comp_code, &reason);
0800 if (comp_code != MQCC_OK) {
0810 printf("mqput_c : Failed at MQCONN. CODE = %ld \n",
0820 reason);
0830 rcd = reason;
0840 goto PROG_END;
0850 }
0860
0870 /* Open object */
0880 strcpy(obj_desc0.ObjectName, que_name[0]);
0890 MQOPEN(qm_handle, &obj_desc0, MQOO_OUTPUT,
0900 &que_handle[0], &comp_code, &reason);
0910 if (comp_code != MQCC_OK) {
0920 printf("mqput_c : Failed at MQOPEN. CODE = %ld\n",
0930 reason);
0940 rcd = reason;
0950 goto MQ_END1;
0960 }
0970
0980 strcpy(obj_desc1.ObjectName, que_name[1]);
0990 MQOPEN(qm_handle, &obj_desc1, MQOO_OUTPUT,
1000 &que_handle[1], &comp_code, &reason);
1010 if (comp_code != MQCC_OK) {
1020 printf("mqput_c : Failed at MQOPEN. CODE = %ld\n",
1030 reason);
1040 rcd = reason;
1050 flags = 1;
1060 }
1070
1080 loop_cnt = 0;
1090 do {
1100 /* begin transaction */
1110 rcd = dc_trn_begin();
1120 if(rcd != DC_OK) {
1130 printf(
1140 "mqput_c : Failed at dc_trn_begin. CODE = %d \n",
1150 rcd);
1160 goto MQ_END2;
1170 }
1180
1190 /* Put message */
1200 put_options.Options = MQPMO_SYNCPOINT;
1210 msg_desc.Persistence = MQPER_PERSISTENT;
1220 strcpy(message_data, PUT_DATA);
1230 buffer_length = strlen(message_data);
1240 MQPUT(qm_handle, que_handle[loop_cnt], &msg_desc,
1250 &put_options, buffer_length,
1260 (PMQBYTE)message_data, &comp_code, &reason);
1270 if (comp_code == MQCC_FAILED) {
1280 printf("mqput_c : Failed at MQPUT. CODE = %ld\n",
1290 reason);
1300 rcd = dc_trn_unchained_rollback();
1310 if (rcd != DC_OK) {
1320 printf("mqput_c : Failed at dc_trn_unchained_rollback.
1330 CODE = %d \n",rcd);
1340 }
1350 goto MQ_END2;
1360 }
1370
1380 /* commit transaction */
1390 rcd = dc_trn_unchained_commit();
1400 if (rcd != DC_OK) {
1410 printf(
1420 mqput_c : Failed at dc_trn_unchained_commit. CODE = %d \n,
1430 rcd);
1440 }
1450 loop_cnt++;
1460 } while(flags == 0 && loop_cnt < 2);
1470
1480 MQ_END2:
1490 /* Close object */
1500 loop_cnt = 0;
1510 do {
1520 MQCLOSE(qm_handle, &que_handle[loop_cnt], MQCO_NONE,
1530 &comp_code, &reason);
1540 if (comp_code != MQCC_OK) {
1550 printf("mqput_c : Failed at MQCLOSE. CODE = %ld\n",
1560 reason);
1570 }
1580 loop_cnt++;
1590 } while (flags == 0 && loop_cnt < 2);
1600
1610 MQ_END1:
1620 /* Disconnect queue manager */
1630 MQDISC(&qm_handle, &comp_code, &reason);
1640 if (comp_code != MQCC_OK) {
1650 printf("mqput_c : Failed at MQDISC. CODE = %ld \n",
1660 reason);
1670 }
1680 /* Termination of UAP */
1690 dc_rpc_close(DCNOFLAGS);
1700
1710 PROG_END:
1720 return;
1730 }
アプリケーションmqputのコーディング例(COBOL言語)を次に示します。
0010 * 0020 ******************************************************** 0030 * mqput_cb * 0040 ******************************************************** 0050 ** name = main() 0060 ** func = main function of UAP 0070 ** (1)start UAP(output start message) 0080 ** (2)MQCONN(Connect queue manager) 0090 ** (3)MQOPEN(Open queue) 0100 ** (4)MQPUT(Put message) 0110 ** (5)MQCLOSE(Close queue) 0120 ** (6)MQDISC(Disconnect queue manager) 0130 ** (7)finish UAP(output end message) 0140 ******************************************************** 0150 * 0160 IDENTIFICATION DIVISION. 0170 * 0180 PROGRAM-ID. MAIN. 0190 * 0200 ******************************************************** 0210 * set data area * 0220 ******************************************************** 0230 * 0240 DATA DIVISION. 0250 WORKING-STORAGE SECTION. 0260 01 RPC-OP-ARG. 0270 02 REQUEST PIC X(8) VALUE 'OPEN '. 0280 02 RET-VALUE PIC X(5) VALUE SPACE. 0290 02 FILLER PIC X(3). 0300 02 FLAGS PIC S9(9) COMP VALUE ZERO. 0310 * 0320 01 RPC-CL-ARG. 0330 02 REQUEST PIC X(8) VALUE 'CLOSE '. 0340 02 RET-VALUE PIC X(5) VALUE SPACE. 0350 02 FILLER PIC X(3). 0360 * 0370 01 ADM-COMP. 0380 02 REQUEST PIC X(8) VALUE 'COMPLETE'. 0390 02 RET-VALUE PIC X(5). 0400 02 FILLER PIC X(3). 0410 02 DTZRADM PIC S9(9) COMP VALUE ZERO. 0420 * 0430 01 TRN-BG-ARG. 0440 02 REQUEST PIC X(8) VALUE 'BEGIN '. 0450 02 RET-VALUE PIC X(5) VALUE SPACE. 0460 01 TRN-CL-ARG. 0470 02 REQUEST PIC X(8) VALUE 'U-COMMIT'. 0480 02 RET-VALUE PIC X(5) VALUE SPACE. 0490 01 TRN-RB-ARG. 0500 02 REQUEST PIC X(8) VALUE 'U-ROLL '. 0510 02 RET-VALUE PIC X(5) VALUE SPACE. 0520 * 0530 01 MQ-OBJECT PIC X(48) VALUE SPACE. 0540 01 MQ-MGRNAME PIC X(48) VALUE SPACE. 0550 01 MQ-HCONN PIC S9(9) BINARY. 0560 01 MQ-COMPCODE PIC S9(9) BINARY. 0570 01 MQ-REASON PIC S9(9) BINARY. 0580 01 MQ-HOBJ1 PIC S9(9) BINARY. 0590 01 MQ-HOBJ2 PIC S9(9) BINARY. 0600 01 MQ-OPTIONS PIC S9(9) BINARY. 0610 01 MQ-BUFFLEN PIC S9(9) BINARY. 0620 01 MQ-DATALEN PIC S9(9) BINARY. 0630 01 MQ-PUT-BUFFER PIC X(200) VALUE SPACE. 0640 01 MQ-FLAGS PIC S9(5) BINARY VALUE 0. 0650 * 0660 01 PUT-DATA PIC X(33) VALUE 0670 '******** sample put data ********'. 0680 * 0690 01 MQ-OBJECT-DESC. 0700 COPY CMQODV. 0710 * 0720 01 MQ-MESSAGE-DESCRIPTOR. 0730 COPY CMQMDV. 0740 * 0750 01 MQ-PUT-MESSAGE-OPTIONS. 0760 COPY CMQPMOV. 0770 * 0780 01 MQ-CONSTANTS. 0790 COPY CMQV SUPPRESS. 0800 * 0810 PROCEDURE DIVISION. 0820 * 0830 ******************************************************** 0840 * RPC-OPEN(Start of UAP) * 0850 ******************************************************** 0860 * 0870 ******************************************************** 0880 * RPC-OPEN(Start of UAP) * 0890 ******************************************************** 0900 * 0910 CALL 'CBLDCRPC' USING RPC-OP-ARG. 0920 IF RET-VALUE OF RPC-OP-ARG NOT = '00000' THEN 0930 DISPLAY 'MQPUT_CB : RPC-OPEN FAILED. CODE = ' 0940 RET-VALUE OF RPC-OP-ARG 0950 GO TO PROG-END 0960 END-IF. 0970 * 0980 ******************************************************** 0990 * ADM-COMPLETE(Report of termination of start * 1000 * Processing of user server) * 1010 ******************************************************** 1020 * 1030 CALL 'CBLDCADM' USING ADM-COMP 1040 IF RET-VALUE OF ADM-COMP NOT = '00000' THEN 1050 DISPLAY 'MQPUT_CB : ADM-COMPLETE FAILED.CODE = ' 1060 RET-VALUE OF ADM-COMP 1070 GO TO PROG-END 1080 END-IF. 1090 * 1100 ******************************************************** 1110 * Connect queue manager * 1120 ******************************************************** 1130 * 1140 CALL 'MQCONN' USING MQ-MGRNAME 1150 MQ-HCONN 1160 MQ-COMPCODE 1170 MQ-REASON 1180 IF MQ-COMPCODE NOT = MQCC-OK THEN 1190 DISPLAY 'MQPUT_CB : MQCONN FAILED. REASON CODE = ' 1200 MQ-REASON 1210 GO TO PROG-END 1220 END-IF. 1230 * 1240 ******************************************************** 1250 * Opening of object * 1260 ******************************************************** 1270 * 1280 MOVE 'rmtq1' TO MQ-OBJECT 1290 MOVE MQ-OBJECT TO MQOD-OBJECTNAME 1300 * 1310 MOVE MQOO-OUTPUT TO MQ-OPTIONS 1320 * 1330 CALL 'MQOPEN' USING MQ-HCONN 1340 MQOD 1350 MQ-OPTIONS 1360 MQ-HOBJ1 1370 MQ-COMPCODE 1380 MQ-REASON 1390 IF MQ-COMPCODE NOT = MQCC-OK THEN 1400 DISPLAY 'MQPUT_CB : MQOPEN FAILED. REASON CODE = ' 1410 MQ-REASON 1420 GO TO MQ-END1 1430 END-IF 1440 * 1450 MOVE 'rmtq2' TO MQ-OBJECT. 1460 MOVE MQ-OBJECT TO MQOD-OBJECTNAME 1470 * 1480 MOVE MQOO-OUTPUT TO MQ-OPTIONS 1490 * 1500 CALL 'MQOPEN' USING MQ-HCONN 1510 MQOD 1520 MQ-OPTIONS 1530 MQ-HOBJ2 1540 MQ-COMPCODE 1550 MQ-REASON 1560 IF MQ-COMPCODE NOT = MQCC-OK THEN 1570 DISPLAY 'MQPUT_CB : MQOPEN FAILED. REASON CODE = ' 1580 MQ-REASON 1590 MOVE 1 TO MQ-FLAGS 1600 END-IF. 1610 * 1620 ******************************************************** 1630 * begin transaction * 1640 ******************************************************** 1650 * 1660 CALL 'CBLDCTRN' USING TRN-BG-ARG 1670 IF RET-VALUE OF TRN-BG-ARG NOT = '00000' THEN 1680 DISPLAY 'MQPUT_CB : TRN-BEGIN FAILED. CODE = ' 1690 RET-VALUE OF TRN-BG-ARG 1700 GO TO MQ-END2 1710 END-IF. 1720 * 1730 ******************************************************** 1740 * Definition of putting of message * 1750 ******************************************************** 1760 * 1770 MOVE MQPMO-SYNCPOINT TO MQPMO-OPTIONS 1780 MOVE MQPER-PERSISTENT TO MQMD-PERSISTENCE 1790 MOVE 33 TO MQ-BUFFLEN 1800 MOVE PUT-DATA TO MQ-PUT-BUFFER 1810 * 1820 ******************************************************** 1830 * Putting of message * 1840 ******************************************************** 1850 * 1860 CALL 'MQPUT' USING MQ-HCONN 1870 MQ-HOBJ1 1880 MQMD 1890 MQPMO 1900 MQ-BUFFLEN 1910 MQ-PUT-BUFFER 1920 MQ-COMPCODE 1930 MQ-REASON 1940 IF MQ-COMPCODE NOT = MQCC-OK THEN 1950 DISPLAY 'MQPUT_CB : MQPUT FAILED. REASON CODE = ' 1960 MQ-REASON 1970 CALL 'CBLDCTRN' USING TRN-RB-ARG 1980 IF RET-VALUE OF TRN-RB-ARG NOT = '00000' 1990 DISPLAY 'MQPUT_CB : TRN-ROLLBK FAILED. CODE = ' 2000 RET-VALUE OF TRN-RB-ARG 2010 END-IF 2020 GO TO MQ-END2 2030 END-IF 2040 IF MQ-FLAGS = 0 THEN 2050 CALL 'MQPUT' USING MQ-HCONN 2060 MQ-HOBJ2 2070 MQMD 2080 MQPMO 2090 MQ-BUFFLEN 2100 MQ-PUT-BUFFER 2110 MQ-COMPCODE 2120 MQ-REASON 2130 IF MQ-COMPCODE NOT = MQCC-OK THEN 2140 DISPLAY 'MQPUT_CB : MQPUT FAILED. REASON CODE = ' 2150 MQ-REASON 2160 CALL 'CBLDCTRN' USING TRN-RB-ARG 2170 IF RET-VALUE OF TRN-RB-ARG NOT = '00000' 2180 DISPLAY 'MQPUT_CB : TRN-ROLLBK FAILED. CODE = ' 2190 RET-VALUE OF TRN-RB-ARG 2200 END-IF 2210 GO TO MQ-END2 2220 END-IF 2230 END-IF. 2240 * 2250 ******************************************************** 2260 * commit transaction * 2270 ******************************************************** 2280 * 2290 CALL 'CBLDCTRN' USING TRN-CL-ARG 2300 IF RET-VALUE OF TRN-CL-ARG NOT = '00000' THEN 2310 DISPLAY 'MQPUT_CB : TRN-COMMIT FAILED.CODE = ' 2320 RET-VALUE OF TRN-CL-ARG 2330 END-IF. 2340 * 2350 ******************************************************** 2360 * Closing of object * 2370 ******************************************************** 2380 * 2390 MQ-END2. 2400 * 2410 MOVE MQCO-NONE TO MQ-OPTIONS 2420 * 2430 CALL 'MQCLOSE' USING MQ-HCONN 2440 MQ-HOBJ1 2450 MQ-OPTIONS 2460 MQ-COMPCODE 2470 MQ-REASON 2480 IF MQ-COMPCODE NOT = MQCC-OK THEN 2490 DISPLAY 'MQPUT_CB : MQCLOSE FAILED. REASON CODE = ' 2500 MQ-REASON 2510 END-IF 2520 * 2530 IF MQ-FLAGS = 0 THEN 2540 MOVE MQCO-NONE TO MQ-OPTIONS 2550 CALL 'MQCLOSE' USING MQ-HCONN 2560 MQ-HOBJ2 2570 MQ-OPTIONS 2580 MQ-COMPCODE 2590 MQ-REASON 2600 IF MQ-COMPCODE NOT = MQCC-OK THEN 2610 DISPLAY 'MQPUT_CB : MQCLOSE FAILED. REASON CODE = ' 2620 MQ-REASON 2630 END-IF 2640 END-IF. 2650 * 2660 ******************************************************** 2670 * Disconnect queue manager * 2680 ******************************************************** 2690 * 2700 MQ-END1. 2710 * 2720 CALL 'MQDISC' USING MQ-HCONN 2730 MQ-COMPCODE 2740 MQ-REASON 2750 IF MQ-COMPCODE NOT = MQCC-OK THEN 2760 DISPLAY 'MQPUT_CB : MQDISC FAILED. REASON CODE = ' 2770 MQ-REASON 2780 END-IF. 2790 * 2800 PROG-END. 2810 * 2820 ******************************************************** 2830 * RPC-CLOSE(Termination of UAP) * 2840 ******************************************************** 2850 CALL 'CBLDCRPC' USING RPC-CL-ARG. 2860 * 2870 STOP RUN. 2880 END PROGRAM MAIN.
メッセージを取り出すアプリケーションの例
ホスト1上で動作するアプリケーションmqgetは,ローカルキューdynq1からメッセージを取り出します。ローカルキューdynq1に登録されているメッセージはチャネルCHA02を経由してホスト2から送信されたものです。
メッセージを取り出すアプリケーションの例について,次の図に示します。
図4-6 メッセージを取り出すアプリケーションの例
アプリケーションmqgetのコーディング例(C言語)を次に示します。
0010 /********************************************************
0020 ** mqget_c.c
0030 ** specification
0040 ** functions = main()
0050 ********************************************************/
0060
0070 /********************************************************
0080 ** name = main()
0090 ** func = main function of UAP
0100 ** (1)start UAP(output start message)
0110 ** (2)MQCONN(Connect queue manager)
0120 ** (3)MQOPEN(Open queue)
0130 ** (4)MQGET(Get message)
0140 ** (5)MQCLOSE(Close queue)
0150 ** (6)MQDISC(Disconnect queue manager)
0160 ** (7)finish UAP(output end message)
0170 ** arg = nothing
0180 ** return = void
0190 ** note =
0200 ********************************************************/
0210 #ifdef TP1MQ_NT
0220 #include <windows.h>
0230 #endif
0240 #include <stdio.h>
0250 #include <string.h>
0260 #include <stdlib.h>
0270 #include <cmqc.h>
0280 #include <dcrpc.h>
0290 #include <dcadm.h>
0300 #include <dctrn.h>
0310
0320 static char *Mid = "%Z% %M%(%E% %U%)-%I% " ;
0330
0340 void main()
0350 {
0360 MQCHAR48 QueueManager=" "; /* queue manager name */
0370 MQCHAR message_data[100]; /* message data */
0380 MQHCONN qm_handle; /* connection handle */
0390 MQHOBJ que_handle; /* object handle */
0400 MQLONG comp_code; /* completion code */
0410 MQLONG reason; /* reason code */
0420 MQLONG buffer_length; /* buffer length */
0430 MQLONG rcd; /* return code */
0440 MQOD obj_desc = { MQOD_DEFAULT };
0450 /* message discriptor */
0460 MQMD msg_desc = { MQMD_DEFAULT };
0470 /* object discriptor */
0480 MQGMO get_options = { MQGMO_DEFAULT };
0490 /* put message options */
0500
0510 /* Start of UAP */
0520 rcd = dc_rpc_open(DCNOFLAGS);
0530 if (rcd != DC_OK) {
0540 printf(
0550 "mqget_c : Failed at dc_rpc_open. CODE = %d \n",
0560 rcd);
0570 goto PROG_END;
0580 }
0590
0600 /* post the completion of user process start
0610 processing */
0620 rcd = dc_adm_complete(DCNOFLAGS);
0630 if (rcd != DC_OK) {
0640 printf(
0650 "mqget_c : Failed at dc_adm_complete. CODE = %d \n",
0660 rcd);
0670 goto PROG_END;
0680 }
0690
0700 /* Connect queue manager */
0710 MQCONN(QueueManager, &qm_handle, &comp_code, &reason);
0720 if (comp_code != MQCC_OK) {
0730 printf("mqget_c : Failed at MQCONN. CODE = %ld \n",
0740 reason);
0750 rcd = reason;
0760 goto PROG_END;
0770 }
0780
0790 /* Open object */
0800 strcpy(obj_desc.ObjectName, "dynq1");
0810 MQOPEN(qm_handle, &obj_desc,
0820 MQOO_BROWSE | MQOO_INPUT_SHARED, &que_handle,
0830 &comp_code, &reason);
0840 if (comp_code != MQCC_OK) {
0850 printf("mqget_c : Failed at MQOPEN. CODE = %ld\n",
0860 reason);
0870 rcd = reason;
0880 goto MQ_END1;
0890 }
0900
0910 /* Get Message */
0920 BROWSE_LOOP:
0930 get_options.Options =
0940 MQGMO_NO_SYNCPOINT | MQGMO_BROWSE_FIRST |
0950 MQGMO_ACCEPT_TRUNCATED_MSG | MQGMO_WAIT;
0960 get_options.WaitInterval = 5000;
0970 memcpy(msg_desc.MsgId, MQMI_NONE,
0980 sizeof(msg_desc.MsgId));
0990 memcpy(msg_desc.CorrelId, MQCI_NONE,
1000 sizeof(msg_desc.CorrelId));
1010 MQGET(qm_handle, que_handle, &msg_desc, &get_options,
1020 0, (PMQBYTE)message_data, &buffer_length,
1030 &comp_code, &reason);
1040 if (comp_code == MQCC_WARNING ||
1050 comp_code == MQCC_FAILED) {
1060 if (reason == MQRC_NO_MSG_AVAILABLE) {
1070 printf("mqget_c : No message.\n");
1080 goto BROWSE_LOOP;
1090 }
1100 else if (reason == MQRC_TRUNCATED_MSG_ACCEPTED){
1110 while (1) {
1120 /* begin transaction */
1130 rcd = dc_trn_begin();
1140 if(rcd != DC_OK) {
1150 printf(
1160 "mqget_c : Failed at dc_trn_begin. CODE = %d \n",
1170 rcd);
1180 goto MQ_END2;
1190 }
1200
1210 /* Get message */
1220 memcpy(msg_desc.MsgId, MQMI_NONE,
1230 sizeof(msg_desc.MsgId));
1240 memcpy(msg_desc.CorrelId, MQCI_NONE,
1250 sizeof(msg_desc.CorrelId));
1260 get_options.Options = MQGMO_SYNCPOINT;
1270 MQGET(qm_handle, que_handle, &msg_desc,
1280 &get_options, buffer_length,
1290 (PMQBYTE)message_data, &buffer_length,
1300 &comp_code, &reason);
1310 if (comp_code != MQCC_OK) {
1320 printf("mqget_c : Failed at MQGET. CODE = %ld\n",
1330 reason);
1340 rcd = dc_trn_unchained_rollback();
1350 if (rcd != DC_OK) {
1360 printf("mqget_c : Failed at dc_trn_unchained_rollback.
1370 CODE = %d \n",rcd);
1380 }
1390 goto MQ_END2;
1400 }
1410 printf("==> %-75.75s\n", message_data);
1420
1430 /* commit transaction */
1440 rcd = dc_trn_unchained_commit();
1450 if (rcd != DC_OK) {
1460 printf(
1470 mqget_c : Failed at dc_trn_unchained_commit. CODE = %d \n,
1480 rcd);
1490 goto MQ_END2;
1500 }
1510 }
1520 }
1530 printf(
1540 "mqget_c : Failed at MQGET. CODE = %ld REASON = %ld\n",
1550 comp_code, reason);
1560 }
1570
1580 MQ_END2:
1590 /* Close object */
1600 MQCLOSE(qm_handle, &que_handle, MQCO_NONE, &comp_code,
1610 &reason);
1620 if (comp_code != MQCC_OK) {
1630 printf("mqget_c : Failed at MQCLOSE. CODE = %ld\n",
1640 reason);
1650 }
1660
1670 MQ_END1:
1680 /* Disconnect queue manager */
1690 MQDISC(&qm_handle, &comp_code, &reason);
1700 if (comp_code != MQCC_OK) {
1710 printf("mqget_c : Failed at MQDISC. CODE = %ld \n",
1720 reason);
1730 }
1740
1750 /* Termination of UAP */
1760 dc_rpc_close(DCNOFLAGS);
1770
1780 PROG_END:
1790 return;
1800 }
アプリケーションmqgetのコーディング例(COBOL言語)を次に示します。
0010 * 0020 ********************************************************* 0030 * mqget_cb * 0040 ********************************************************* 0050 ** name = main() 0060 ** func = main function of UAP 0070 ** (1)start UAP(output start message) 0080 ** (2)MQCONN(Connect queue manager) 0090 ** (3)MQOPEN(Open queue) 0100 ** (4)MQGET(Get message) 0110 ** (5)MQCLOSE(Close queue) 0120 ** (6)MQDISC(Disconnect queue manager) 0130 ** (7)finish UAP(output end message) 0140 ********************************************************* 0150 * 0160 IDENTIFICATION DIVISION. 0170 * 0180 PROGRAM-ID. MAIN. 0190 * 0200 ********************************************************* 0210 * set data area * 0220 ********************************************************* 0230 * 0240 DATA DIVISION. 0250 WORKING-STORAGE SECTION. 0260 01 RPC-OP-ARG. 0270 02 REQUEST PIC X(8) VALUE 'OPEN '. 0280 02 RET-VALUE PIC X(5) VALUE SPACE. 0290 02 FILLER PIC X(3). 0300 02 FLAGS PIC S9(9) COMP VALUE ZERO. 0310 * 0320 01 RPC-CL-ARG. 0330 02 REQUEST PIC X(8) VALUE 'CLOSE '. 0340 02 RET-VALUE PIC X(5) VALUE SPACE. 0350 02 FILLER PIC X(3). 0360 02 DTZRRPC PIC S9(9) COMP VALUE ZERO. 0370 * 0380 01 ADM-COMP. 0390 02 REQUEST PIC X(8) VALUE 'COMPLETE'. 0400 02 RET-VALUE PIC X(5). 0410 02 FILLER PIC X(3). 0420 02 DTZRADM PIC S9(9) COMP VALUE ZERO. 0430 * 0440 01 TRN-BG-ARG. 0450 02 REQUEST PIC X(8) VALUE 'BEGIN '. 0460 02 RET-VALUE PIC X(5) VALUE SPACE. 0470 * 0480 01 TRN-CL-ARG. 0490 02 REQUEST PIC X(8) VALUE 'U-COMMIT'. 0500 02 RET-VALUE PIC X(5) VALUE SPACE. 0510 01 TRN-RB-ARG. 0520 02 REQUEST PIC X(8) VALUE 'U-ROLL '. 0530 02 RET-VALUE PIC X(5) VALUE SPACE. 0540 * 0550 01 MQ-OBJECT PIC X(48) VALUE SPACE. 0560 01 MQ-MGRNAME PIC X(48) VALUE SPACE. 0570 01 MQ-HCONN PIC S9(9) BINARY. 0580 01 MQ-COMPCODE PIC S9(9) BINARY. 0590 01 MQ-REASON PIC S9(9) BINARY. 0600 01 MQ-HOBJ PIC S9(9) BINARY. 0610 01 MQ-OPTIONS PIC S9(9) BINARY. 0620 01 MQ-BUFFLEN PIC S9(9) BINARY. 0630 01 MQ-DATALEN PIC S9(9) BINARY. 0640 01 MQ-GET-BUFFER PIC X(128). 0650 * 0660 01 MQ-OBJECT-DESC. 0670 COPY CMQODV. 0680 * 0690 01 MQ-MESSAGE-DESCRIPTOR. 0700 COPY CMQMDV. 0710 * 0720 01 MQ-GET-MESSAGE-OPTIONS. 0730 COPY CMQGMOV. 0740 * 0750 01 MQ-CONSTANTS. 0760 COPY CMQV SUPPRESS. 0770 * 0780 PROCEDURE DIVISION. 0790 * 0800 ********************************************************* 0810 * RPC-OPEN(Start of UAP) * 0820 ********************************************************* 0830 * 0840 CALL 'CBLDCRPC' USING RPC-OP-ARG. 0850 IF RET-VALUE OF RPC-OP-ARG NOT = '00000' 0860 DISPLAY 'MQGET_CB : RPC-OPEN FAILED. CODE = ' 0870 RET-VALUE OF RPC-OP-ARG 0880 GO TO PROG-END 0890 END-IF. 0900 * 0910 ********************************************************* 0920 * ADM-COMPLETE(post the completion of * 0930 * user process start processing) * 0940 ********************************************************* 0950 * 0960 CALL 'CBLDCADM' USING ADM-COMP. 0970 IF RET-VALUE OF ADM-COMP NOT = '00000' 0980 DISPLAY 'MQGET_CB : ADM-COMPLETE FAILED.CODE = ' 0990 RET-VALUE OF ADM-COMP 1000 GO TO PROG-END 1010 END-IF. 1020 * 1030 ********************************************************* 1040 * Connect queue manager * 1050 ********************************************************* 1060 * 1070 CALL 'MQCONN' USING MQ-MGRNAME 1080 MQ-HCONN 1090 MQ-COMPCODE 1100 MQ-REASON. 1110 IF MQ-COMPCODE NOT = MQCC-OK 1120 DISPLAY 'MQGET_CB : MQCONN FAILED. REASON CODE = ' 1130 MQ-REASON 1140 GO TO PROG-END 1150 END-IF. 1160 * 1170 ********************************************************* 1180 * Opening of object * 1190 ********************************************************* 1200 * 1210 MOVE 'dynq1' TO MQ-OBJECT. 1220 MOVE MQ-OBJECT TO MQOD-OBJECTNAME. 1230 * 1240 COMPUTE MQ-OPTIONS = MQOO-INPUT-SHARED + 1250 MQOO-BROWSE. 1260 * 1270 CALL 'MQOPEN' USING MQ-HCONN 1280 MQOD 1290 MQ-OPTIONS 1300 MQ-HOBJ 1310 MQ-COMPCODE 1320 MQ-REASON. 1330 IF MQ-COMPCODE NOT = MQCC-OK 1340 DISPLAY 'MQGET_CB : MQOPEN FAILED. REASON CODE = ' 1350 MQ-REASON 1360 GO TO MQ-END1 1370 END-IF. 1380 * 1390 ********************************************************* 1400 * Getting of browse message * 1410 ********************************************************* 1420 * 1430 BROWSE-LOOP. 1440 COMPUTE MQGMO-OPTIONS = MQGMO-NO-SYNCPOINT + 1450 MQGMO-BROWSE-FIRST + 1460 MQGMO-ACCEPT-TRUNCATED-MSG + 1470 MQGMO-WAIT. 1480 MOVE MQMI-NONE TO MQMD-MSGID. 1490 MOVE MQCI-NONE TO MQMD-CORRELID. 1500 MOVE 5000 TO MQGMO-WAITINTERVAL. 1510 MOVE 0 TO MQ-BUFFLEN. 1520 CALL 'MQGET' USING MQ-HCONN 1530 MQ-HOBJ 1540 MQMD 1550 MQGMO 1560 MQ-BUFFLEN 1570 MQ-GET-BUFFER 1580 MQ-DATALEN 1590 MQ-COMPCODE 1600 MQ-REASON 1610 IF (MQ-COMPCODE = MQCC-WARNING) OR 1620 (MQ-COMPCODE = MQCC-FAILED) 1630 IF MQ-REASON = MQRC-NO-MSG-AVAILABLE 1640 DISPLAY 'MQGET_CB : NO MESSAGE' 1650 GO TO BROWSE-LOOP 1660 ELSE 1670 IF MQ-REASON = MQRC-TRUNCATED-MSG-ACCEPTED 1680 PERFORM GET-MSG-PROC 1690 END-IF 1700 ELSE 1710 DISPLAY 'MQGET_CB : MQGET FAILED. CODE = ' MQ-COMPCODE 1720 DISPLAY ' REASON CODE = ' 1730 MQ-REASON 1740 END-IF. 1750 * 1760 ********************************************************* 1770 * Closing of object * 1780 ********************************************************* 1790 * 1800 MQ-END2. 1810 * 1820 MOVE MQCO-NONE TO MQ-OPTIONS 1830 * 1840 CALL 'MQCLOSE' USING MQ-HCONN 1850 MQ-HOBJ 1860 MQ-OPTIONS 1870 MQ-COMPCODE 1880 MQ-REASON 1890 IF MQ-COMPCODE NOT = MQCC-OK THEN 1900 DISPLAY 'MQGET_CB : MQCLOSE FAILED. REASON CODE = ' 1910 MQ-REASON 1920 END-IF. 1930 * 1940 ********************************************************* 1950 * Disconnect queue manager * 1960 ********************************************************* 1970 * 1980 MQ-END1. 1990 * 2000 CALL 'MQDISC' USING MQ-HCONN 2010 MQ-COMPCODE 2020 MQ-REASON 2030 IF MQ-COMPCODE NOT = MQCC-OK 2040 DISPLAY 'MQGET_CB : MQDISC FAILED. REASON CODE = ' 2050 MQ-REASON 2060 END-IF. 2070 * 2080 PROG-END. 2090 * 2100 ********************************************************* 2110 * RPC-CLOSE(Termination of UAP) * 2120 ********************************************************* 2130 CALL 'CBLDCRPC' USING RPC-CL-ARG. 2140 * 2150 * 2160 STOP RUN. 2170 GET-MSG-PROC. 2180 * 2190 ********************************************************* 2200 * begin transaction * 2210 ********************************************************* 2220 * 2230 CALL 'CBLDCTRN' USING TRN-BG-ARG 2240 IF RET-VALUE OF TRN-BG-ARG NOT = '00000' 2250 DISPLAY 'MQGET_CB : TRN-BEGIN FAILED. CODE = ' 2260 RET-VALUE OF TRN-BG-ARG 2270 GO TO MQ-END2 2280 END-IF 2290 MOVE 0 TO MQGMO-OPTIONS 2300 MOVE MQMI-NONE TO MQMD-MSGID. 2310 MOVE MQCI-NONE TO MQMD-CORRELID. 2320 COMPUTE MQGMO-OPTIONS = MQGMO-SYNCPOINT 2330 COMPUTE MQ-BUFFLEN = MQ-DATALEN 2340 CALL 'MQGET' USING MQ-HCONN 2350 MQ-HOBJ 2360 MQMD 2370 MQGMO 2380 MQ-BUFFLEN 2390 MQ-GET-BUFFER 2400 MQ-DATALEN 2410 MQ-COMPCODE 2420 MQ-REASON 2430 IF MQ-COMPCODE NOT = MQCC-OK 2440 DISPLAY 'MQGET_CB : MQGET FAILED. CODE = ' 2450 MQ-COMPCODE 2460 DISPLAY ' REASON CODE = ' 2470 MQ-REASON 2480 CALL 'CBLDCTRN' USING TRN-RB-ARG 2490 IF RET-VALUE OF TRN-RB-ARG NOT = '00000' 2500 DISPLAY 'MQGET_CB : TRN-ROLLBK FAILED. CODE = ' 2510 RET-VALUE OF TRN-RB-ARG 2520 END-IF 2530 GO TO MQ-END2 2540 END-IF 2550 DISPLAY 'MQGET_CB MESSAGE : ' MQ-GET-BUFFER 2560 * 2570 ********************************************************* 2580 * commit transaction * 2590 ********************************************************* 2600 * 2610 CALL 'CBLDCTRN' USING TRN-CL-ARG 2620 IF RET-VALUE OF TRN-CL-ARG NOT = '00000' 2630 DISPLAY 'MQGET_CB : TRN-COMMIT FAILED. CODE = ' 2640 RET-VALUE OF TRN-CL-ARG 2650 GO TO MQ-END2 2660 END-IF 2670 GO TO GET-MSG-PROC. 2680 2690 END PROGRAM MAIN.
All Rights Reserved. Copyright (C) 2006, 2011, Hitachi, Ltd.
(C) Copyright International Business Machines Corporation 1999, 2002. All rights reserved.