システム構成例
製品が提供するサンプルコードを使用したシステム構成例について説明します。
サンプルコードのシステム構成
製品が提供するサンプルコードは,ホスト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.