2017-03-02 72 views
0

我正在使用websphere版本9并使用示例程序进行订阅以订阅主题。以下是我的代码。我已将工作单元引入样本。IBM Websphere MQ - MQGET不会从队列中删除邮件

问题是 - 在每个MQGET并提交队列中的消息不会被清除之后。

有什么想法?这与创建队列的方式有关吗?持久,耐用等。?

MQSUB(Hcon,      /* connection handle   */ 
     &sd,      /* object descriptor for queue */ 
     &Hobj,      /* object handle (output)  */ 
     &Hsub,      /* object handle (output)  */ 
     &S_CompCode,    /* completion code    */ 
     &Reason);     /* reason code     */ 
    CompCode = S_CompCode;   /* use MQOPEN result for initial test */ 

    gmo.Options = MQGMO_WAIT   /* wait for new messages  */ 
       | MQGMO_SYNCPOINT /* transaction    */ 
       | MQGMO_CONVERT;  /* convert if necessary  */ 

    gmo.WaitInterval = MQWI_UNLIMITED; 
    while (CompCode != MQCC_FAILED) 
    { 
    buflen = sizeof(buffer) - 1; /* buffer size available for GET */ 
    memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId)); 
    memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId)); 
    md.Encoding  = MQENC_NATIVE; 
    md.CodedCharSetId = MQCCSI_Q_MGR; 

    /************************************************************************/ 
      /* Start a unit of work             */ 
    /************************************************************************/ 
    MQBEGIN (Hcon, &bo, &CompCode, &Reason); 

    MQGET(Hcon,    /* connection handle     */ 
      Hobj,    /* object handle      */ 
      &md,     /* message descriptor    */ 
      &gmo,    /* get message options    */ 
      buflen,    /* buffer length      */ 
      buffer,    /* message buffer     */ 
      &messlen,   /* message length     */ 
      &CompCode,   /* completion code     */ 
      &Reason);   /* reason code      */ 

    /****************************************************************/ 
    /* Display each message received        */ 
    /****************************************************************/ 
    if (CompCode != MQCC_FAILED) 
    { 
     buffer[messlen] = '\0';   /* add terminator   */ 
     char* strings[] = {buffer}; 
     bool client_commit_status = callback(strings); 
     if(client_commit_status){ 
      MQCMIT(Hcon, &CompCode, &Reason); 
      if (MQCC_OK != CompCode){ 
       MQBACK(Hcon, &CompCode, &Reason); 
      } 
     }else{ 
      MQBACK(Hcon, &CompCode, &Reason); 
     } 
    } 
+0

你怎么知道'MQCMIT()'被调用?什么是'callback()'返回? 'MQCMIT()'失败了,事务被回滚了吗?一些'printf()'语句可以打印出'client_commit_status'的值,并显示是否调用'MQBACK()'可以清除它。 – mhawke

+0

我添加了'printf()'并确认MQCMIT正在被调用。我已经从发布的代码中删除了它们,以减少行数。 – Muthukumar

+0

好的,你是否还证实'MQBACK()'不被调用? – mhawke

回答

0

我删除了MQSUB调用,并用下面的代码替换它。由于我的所有订阅都是通过配置导向到目标队列,所以我直接聆听队列。现在MQGET清除队列。

if (strlen(target_queue_name)) { 
        strncpy(od.ObjectName, target_queue_name, MQ_Q_NAME_LENGTH); 
        MQOPEN(Hcon, &od, MQOO_INPUT_AS_Q_DEF | MQOO_FAIL_IF_QUIESCING | MQOO_INQUIRE, 
         &Hobj, &CompCode, &Reason); 
        if (CompCode != MQCC_OK) { 
          printf("MQOPEN ended with reason code %d\n", Reason); 
          return (int)Reason; 
        } 
     }