Hitachi

OpenTP1 Version 7 OpenTP1 メッセージキューイング機能 TP1/Message Queue 使用の手引


システム構成例

製品が提供するサンプルコードを使用したシステム構成例について説明します。

〈このページの構成〉

サンプルコードのシステム構成

製品が提供するサンプルコードは,ホスト1とホスト2,およびホスト1とホスト3とでメッセージを送受信するシステム構成です。

サンプルコードのシステム構成について,次の図に示します。

図4‒4 サンプルコードのシステム構成

[図データ]

このシステム構成でのホスト1,ホスト2,およびホスト3の定義コーディング例を次に示します。

メッセージを登録するアプリケーションの例

ホスト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   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.