2017-06-16 70 views
-4

我運行C程序,它連接到MQ並嘗試從中獲取消息。我總是得到一個消息:
MQGET原因代碼2037
這意味着MQ不打開結束,但MQOPEN CC = 0 RC = 0My C with MQ收到消息返回碼2037

MQ錯誤日誌是空的。

這是程序

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

我已經改變字符TempBuf聲明MQBYTE並沒有幫助

+0

要回答這樣的問題,我們需要看到_smallest possible_,_complete program_,_that再現問題_。所有三個屬性都是必需的。這不是那樣的 - 你遺漏了關鍵部分並作出了改變,使程序在語法上無效。請閱讀並按照https://stackoverflow.com/help/mcve上的說明進行操作。 – zwol

+0

最重要的是,你似乎用佔位符替換了此程序中調用「MQCONNX」和「MQOPEN」的調用。我們需要看到這些。而且,每個'**/* comment */**'形式的構造都應該拋出語法錯誤。 – zwol

+0

請出示您的MQOPEN電話。 – JoshMc

回答

0

MQRC 2037 MQRC_NOT_OPEN_FOR_INPUT,你可以找到這個信息通過運行提供的MQRC命令使用IBM MQ客戶機或服務器安裝,以下是Linux服務器上的示例輸出:

$ mqrc 2037 

     2037 0x000007f5 MQRC_NOT_OPEN_FOR_INPUT 

你沒有表現MQOPEN調用,但如果使用O_options,它會通過這個來解釋,你目前有以下幾種:

O_options = MQOO_OUTPUT + MQOO_FAIL_IF_QUIESCING; 

這應該someing像下面這樣:

O_options = MQOO_INPUT_AS_Q_DEF + MQOO_FAIL_IF_QUIESCING; 

我建議您查看隨IBM MQ安裝提供的示例應用程序。在Linux上,這些將位於/opt/mqm/samp。示例amqsget0.c與您的程序類似,只是它使用MQCONN而不是MQCONNX。

+0

我準備好吻你。我改變了選項,它完美地工作。大。你很聰明,樂於助人。非常感謝你。我欠你,你想要什麼?伏特加,干邑,葡萄酒,餐廳,應有盡有 – SamOl