2017-03-02 1 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()'가 실패하여 트랜잭션이 롤백 되었습니까? 'client_commit_status'의 값을 출력하고'MQBACK()'이 불려 갔는지를 보여주기위한 몇가지'printf()'문장은 그것을 지울 수 있습니다. – mhawke

+0

'printf()'를 추가하고 MQCMIT가 호출되고 있음을 확인했습니다. 내가 줄 번호를 적게 게시 된 코드에서 그들을 제거했습니다. – Muthukumar

+0

OK,'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; 
        } 
     }