2017-03-02 38 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; 
        } 
     } 
関連する問題