システム構成例
製品が提供するサンプルコードを使用したシステム構成例について説明します。
サンプルコードのシステム構成
製品が提供するサンプルコードは,ホスト1とホスト2,およびホスト1とホスト3とでメッセージを送受信するシステム構成です。
サンプルコードのシステム構成について,次の図に示します。
このシステム構成でのホスト1,ホスト2,およびホスト3の定義コーディング例を次に示します。
-
MQAサービス定義のコーディング例
# # 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
-
ホスト1(_mqtd1)のMQT通信構成定義のコーディング例
# # 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
-
ホスト1(_mqtd2)のMQT通信構成定義のコーディング例
# # 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
-
ホスト2のMQT通信構成定義のコーディング例
# # 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
-
ホスト3のMQT通信構成定義のコーディング例
# # 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に送信されます。
メッセージを登録するアプリケーションの例について,次の図に示します。
アプリケーション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から送信されたものです。
メッセージを取り出すアプリケーションの例について,次の図に示します。
アプリケーション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 int flags = 1; /* loop flag */ 0510 0520 /* Start of UAP */ 0530 rcd = dc_rpc_open(DCNOFLAGS); 0540 if (rcd != DC_OK) { 0550 printf( 0560 "mqget_c : Failed at dc_rpc_open. CODE = %d \n", 0570 rcd); 0580 goto PROG_END; 0590 } 0600 0610 /* post the completion of user process start 0620 processing */ 0630 rcd = dc_adm_complete(DCNOFLAGS); 0640 if (rcd != DC_OK) { 0650 printf( 0660 "mqget_c : Failed at dc_adm_complete. CODE = %d \n", 0670 rcd); 0680 goto PROG_END; 0690 } 0700 0710 /* Connect queue manager */ 0720 MQCONN(QueueManager, &qm_handle, &comp_code, &reason); 0730 if (comp_code != MQCC_OK) { 0740 printf("mqget_c : Failed at MQCONN. CODE = %ld \n", 0750 reason); 0760 rcd = reason; 0770 goto PROG_END; 0780 } 0790 0800 /* Open object */ 0810 strcpy(obj_desc.ObjectName, "dynq1"); 0820 MQOPEN(qm_handle, &obj_desc, 0830 MQOO_BROWSE | MQOO_INPUT_SHARED, &que_handle, 0840 &comp_code, &reason); 0850 if (comp_code != MQCC_OK) { 0860 printf("mqget_c : Failed at MQOPEN. CODE = %ld\n", 0870 reason); 0880 rcd = reason; 0890 goto MQ_END1; 0900 } 0910 0920 /* Get Message */ 0930 BROWSE_LOOP: 0940 get_options.Options = 0950 MQGMO_NO_SYNCPOINT | MQGMO_BROWSE_FIRST | 0960 MQGMO_ACCEPT_TRUNCATED_MSG | MQGMO_WAIT; 0970 get_options.WaitInterval = 5000; 0980 memcpy(msg_desc.MsgId, MQMI_NONE, 0990 sizeof(msg_desc.MsgId)); 1000 memcpy(msg_desc.CorrelId, MQCI_NONE, 1010 sizeof(msg_desc.CorrelId)); 1020 MQGET(qm_handle, que_handle, &msg_desc, &get_options, 1030 0, (PMQBYTE)message_data, &buffer_length, 1040 &comp_code, &reason); 1050 if (comp_code == MQCC_WARNING || 1060 comp_code == MQCC_FAILED) { 1070 if (reason == MQRC_NO_MSG_AVAILABLE) { 1080 printf("mqget_c : No message.\n"); 1090 goto BROWSE_LOOP; 1100 } 1110 else if (reason == MQRC_TRUNCATED_MSG_ACCEPTED){ 1120 while (flags == 1) { 1130 /* begin transaction */ 1140 rcd = dc_trn_begin(); 1150 if(rcd != DC_OK) { 1160 printf( 1170 "mqget_c : Failed at dc_trn_begin. CODE = %d \n", 1180 rcd); 1190 goto MQ_END2; 1200 } 1210 1220 /* Get message */ 1230 memcpy(msg_desc.MsgId, MQMI_NONE, 1240 sizeof(msg_desc.MsgId)); 1250 memcpy(msg_desc.CorrelId, MQCI_NONE, 1260 sizeof(msg_desc.CorrelId)); 1270 get_options.Options = MQGMO_SYNCPOINT; 1280 MQGET(qm_handle, que_handle, &msg_desc, 1290 &get_options, buffer_length, 1300 (PMQBYTE)message_data, &buffer_length, 1310 &comp_code, &reason); 1320 if (comp_code != MQCC_OK) { 1330 printf("mqget_c : Failed at MQGET. CODE = %ld\n", 1340 reason); 1350 rcd = dc_trn_unchained_rollback(); 1360 if (rcd != DC_OK) { 1370 printf("mqget_c : Failed at dc_trn_unchained_rollback. 1380 CODE = %d \n",rcd); 1390 } 1400 goto MQ_END2; 1410 } 1420 printf("==> %-75.75s\n", message_data); 1430 1440 /* commit transaction */ 1450 rcd = dc_trn_unchained_commit(); 1460 if (rcd != DC_OK) { 1470 printf( 1480 mqget_c : Failed at dc_trn_unchained_commit. CODE = %d \n, 1490 rcd); 1500 goto MQ_END2; 1510 } 1520 } 1530 } 1540 printf( 1550 "mqget_c : Failed at MQGET. CODE = %ld REASON = %ld\n", 1560 comp_code, reason); 1570 } 1580 1590 MQ_END2: 1600 /* Close object */ 1610 MQCLOSE(qm_handle, &que_handle, MQCO_NONE, &comp_code, 1620 &reason); 1630 if (comp_code != MQCC_OK) { 1640 printf("mqget_c : Failed at MQCLOSE. CODE = %ld\n", 1650 reason); 1660 } 1670 1680 MQ_END1: 1690 /* Disconnect queue manager */ 1700 MQDISC(&qm_handle, &comp_code, &reason); 1710 if (comp_code != MQCC_OK) { 1720 printf("mqget_c : Failed at MQDISC. CODE = %ld \n", 1730 reason); 1740 } 1750 1760 /* Termination of UAP */ 1770 dc_rpc_close(DCNOFLAGS); 1780 1790 PROG_END: 1800 return; 1810 }
アプリケーション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.