My C with MQ receive a message return code 2037

匿名 (未验证) 提交于 2019-12-03 02:44:02

问题:

I run the C program, which connect to MQ and try to get a message from it. I always get a message:
MQGET ended with reason code 2037
which means that MQ is not opened, but MQOPEN CC=0 RC=0

MQ error log is empty.

this is the program

           #include <stdio.h>               #include <stdlib.h>                  #include <string.h>                   #include <cmqc.h>      /* includes for MQI*/                          #include <cmqxc.h>                int main(int argc, char **argv)                {            MQCNO   Connect_options = {MQCNO_DEFAULT};/MQNONNX opt*/               MQCD    ClientConn = {MQCD_CLIENT_CONN_DEFAULT};/*client channel*/              MQHCONN  Hcon;                   /* connection handle  */              MQHOBJ   Hobj;                   /* object handle */               MQLONG   CompCode;               /* completion code  */               MQLONG   OpenCode;               /* MQOPEN completion code*/              MQLONG   Reason;                 /* reason code    */               MQOD     od = {MQOD_DEFAULT};    /* Object Descriptor */               MQMD     md = {MQMD_DEFAULT};    /* Message Descriptor */               MQPMO    pmo = {MQPMO_DEFAULT};  /* put message options*/               MQLONG   O_options;              /* MQOPEN options  */               MQLONG   C_options;              /* MQCLOSE options */               MQGMO   gmo = {MQGMO_DEFAULT};   /* get message options */                char     QMgrName[MQ_Q_MGR_NAME_LENGTH+1];            char     QName[MQ_Q_NAME_LENGTH+1];            char     channelName[MQ_CHANNEL_NAME_LENGTH+1];            char     hostname[1024];            char     port[4];            MQLONG   buflen;        /* buffer length*/            char TempBuf[65536];            int msgsToGet;            int msgsGot;             if (argc != 6)               {                printf("Usage: MQTest11 QMgrName ChlName hostname port  QName\n");                return(1);               }                 **/* copy MQ manager name */**               strncpy(QMgrName, argv[1], MQ_Q_MGR_NAME_LENGTH);                QMgrName[MQ_Q_MGR_NAME_LENGTH] = '\0';                 **/* copy channel name */**            strncpy(channelName, argv[2], MQ_CHANNEL_NAME_LENGTH);                channelName[MQ_CHANNEL_NAME_LENGTH] = '\0';                 **/* copy hostname */**            strncpy(hostname, argv[3], 1023);                hostname[1023] = '\0';              **/* copy port number */**               strncpy(port,argv[4],4);                strncpy(QName, argv[5], MQ_Q_NAME_LENGTH);                QName[MQ_Q_NAME_LENGTH] = '\0';                 **/* copy hostname for connection */**            strncpy(ClientConn.ConnectionName,hostname, MQ_CONN_NAME_LENGTH);                 **/* copy channel name */**            strncpy(ClientConn.ChannelName,channelName,MQ_CHANNEL_NAME_LENGTH);                **/* Point the MQCNO to the client connection definition */**               Connect_options.ClientConnPtr = &ClientConn;                Connect_options.Version = MQCNO_VERSION_2;                 **/* use MQCONNX */**                 if (CompCode == MQCC_FAILED)                {                    /* exit with print the reason */                }                else                {                 strncpy(od.ObjectName, QName, (size_t)MQ_Q_NAME_LENGTH);                 O_options = MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING;                 MQOPEN(Hcon,                      /* connection handle  */                &od,                       /* object descriptor for queue  */                O_options,                 /* open options                 */                &Hobj,                     /* object handle                */                &OpenCode,                 /* MQOPEN completion code       */                &Reason);                  /* reason code                  */                 printf("MQTest11 MQOPEN CC=%ld RC=%ld\n", CompCode, Reason);              if (OpenCode == MQCC_OK)    /* if MQOPEN , then continue in the while loop */                   {                 gmo.Options = MQGMO_WAIT + MQGMO_CONVERT;                 gmo.WaitInterval = 15000;                 msgsGot = 0;                 msgsToGet = 0;                 CompCode = OpenCode;                 }                  while (CompCode != MQCC_FAILED && ((msgsToGet == 0) || (msgsGot < msgsToGet)))                 {                /* define length of the buffer -1 */               buflen = strlen(TempBuf) - 1;    */ buffer length */            memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId)); /*copy msg ID*/                 memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));/*copy corrlID*/                  md.Encoding       = MQENC_NATIVE; /*encode*/               md.CodedCharSetId = MQCCSI_Q_MGR;                /* function to get message from MQ*/            MQGET(Hcon,       /* get message from MQ */               Hobj,             /* object handle*/               &md,              /* message descriptor*/               &gmo,             /*get message options*/                buflen,           /*buffer length*/               TempBuf,          /* buffer */               &messlen,         /* message length*/               &CompCode,       /* completion code*/               &Reason);         /* reason code*/              **/* I put some statements to check if transaction failed or not*/**                if (Reason != MQRC_NONE)                 {               if (Reason == MQRC_NO_MSG_AVAILABLE)               {               /* print statement no more messages */               else               {                 printf("MQGET ended with reason code %d comcode %d\n",Reason,CompCode);                    if (Reason == MQRC_TRUNCATED_MSG_FAILED)                 {                 /print statement that it is failed*/                 }                  }                }                 **This is almost done, only statement if Compcode not failed, then print buffer**    

I have changed char TempBuf declaration to MQBYTE and it is not help

回答1:

MQRC 2037 is MQRC_NOT_OPEN_FOR_INPUT, you can find this information by running the mqrc command provided with the IBM MQ Client or server install, below is a sample output on a Linux server:

$ mqrc 2037        2037  0x000007f5  MQRC_NOT_OPEN_FOR_INPUT 

You do not show the MQOPEN call but if it is using the O_options, it would be explained by this, you currently have the following:

O_options = MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING;  

This should someing like the following:

O_options = MQOO_INPUT_AS_Q_DEF + MQOO_FAIL_IF_QUIESCING;  

I would suggested that you review the sample applications provided with the IBM MQ install. On Linux these would be located in /opt/mqm/samp. The sample amqsget0.c would be similar to your program except it is using a MQCONN not MQCONNX.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!