我的带有MQ的C收到一条消息返回码2037 [英] My C with MQ receive a message return code 2037

查看:227
本文介绍了我的带有MQ的C收到一条消息返回码2037的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我运行C程序,该程序连接到MQ并尝试从中获取消息.我总是收到一条消息:
MQGET以原因码2037结尾
这表示未打开MQ,但是MQOPEN CC = 0 RC = 0

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错误日志为空.

MQ error log is empty.

这是程序

           #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**   

我已将char TempBuf声明更改为MQBYTE,这无济于事

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

推荐答案

MQRC 2037是MQRC_NOT_OPEN_FOR_INPUT,您可以通过运行IBM MQ Client或服务器安装随附的mqrc命令来找到此信息,以下是Linux上的示例输出服务器:

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

您没有显示MQOPEN调用,但是如果正在使用O_options,将对此进行解释,当前您具有以下内容:

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; 

我建议您查看IBM MQ安装随附的样本应用程序.在Linux上,这些文件位于/opt/mqm/samp中.样本amqsget0.c与您的程序类似,除了它使用的是MQCONN而不是MQCONNX.

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.

这篇关于我的带有MQ的C收到一条消息返回码2037的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆