2015-02-21 3 views
1

Я пытаюсь получить сообщение из очереди MQ. Ниже приведен код, я использую:Не удалось получить сообщение из очереди MQ

//Fetching Queue details 
    MQEnvironment.hostname=getMqCall().getMqHost(); 
    MQEnvironment.channel=getMqCall().getMqChannel(); 
    MQEnvironment.port=getMqCall().getMqPort(); 
    MQQueueManager qMgr= new MQQueueManager(getMqCall().getMqQueManager()); 
    MQQueue outputQueue = qMgr.accessQueue(getMqCall().getRespQueue(), MQC.MQOO_INQUIRE | MQC.MQOO_BROWSE | MQC.MQOO_INPUT_AS_Q_DEF); 

    //Checking for messages in queue 
    int i=outputQueue.getCurrentDepth(); 
    System.out.println("Number of messages in Assign promo queue:: "+i); 

    for(int j=0;j<i;j++){ 
    MQMessage sampleResponse = new MQMessage(); 
    MQGetMessageOptions gmo = new MQGetMessageOptions(); 
    outputQueue.get(sampleResponse, gmo); 
    String msgtext = sampleResponse.readStringOfCharLength(sampleResponse.getMessageLength()); 

    System.out.println("Message read is: "+msgtext); 
    System.out.println("Response length: "+sampleResponse.getTotalMessageLength()); 

    if(msgtext!=null){ 

    // Some code 

    }else{ 

    System.out.println("Message not read from response queue"); 

    } 

    } 

    //Checking for messages in queue after processing 
    i=outputQueue.getCurrentDepth(); 
    System.out.println("Number of messages in queue after processing :: "+i); 

    outputQueue.close(); 
    qMgr.close(); 
    qMgr.disconnect(); 

Я получаю msgtext значение как нуль, даже если getCurrentDepth() показывает мне, что значения присутствуют в очереди. Даже getTotalMessageLength() возвращает значение null. Подтвердили, что сообщения присутствуют в этой очереди.

Раньше я использовал readString() метод вместо readStringOfCharLength(). Тем не менее, я все еще не получал ответа, поэтому я проверил с readStringOfCharLength(), поскольку метод readString() устарел.

Я даже попытался использовать метод readLine(), но все еще не смог получить сообщение.

Заранее спасибо.

PS: Я запускаю вышеуказанный фрагмент кода через планировщик, который запускается каждые 15 минут.

+0

Как же нет проверки для кодов возврата MQ? Существует несколько причин для поведения, которое вы видите, но без кодов возврата все, что мы можем сделать, - это делать дикие догадки. Что происходит, когда вы пытаетесь просмотреть очередь, используя пример кода? –

ответ

2

Никогда не устанавливайте петлю на основе текущей глубины очереди. Существует много причин, по которым это невозможно сделать, и документируется в документе IBM MQ Standards.

Во-вторых, убедитесь, что вы уловили MQExceptions, выброшенные MQ. В противном случае вы будете публиковать сообщения, в которых говорится: «Где мое сообщение». Самое важное в MQException - это код причины. Все коды причин MQ задокументированы в Центре знаний MQ. Добавьте ссылку и получите доступ к поисковым кодам.

Наконец, здесь правильно структурированы Java/MQ программы:

private void testReceive() 
{ 
    int openOptions = CMQC.MQOO_INQUIRE + CMQC.MQOO_INPUT_SHARED + CMQC.MQOO_FAIL_IF_QUIESCING; 
    MQGetMessageOptions getOptions = new MQGetMessageOptions(); 
    getOptions.options = CMQC.MQGMO_NO_WAIT + CMQC.MQGMO_FAIL_IF_QUIESCING; 
    boolean getMore = true; 
    MQQueueManager qMgr = null; 
    MQQueue queue = null; 
    MQMessage receiveMsg = null; 

    try 
    { 
     qMgr = new MQQueueManager(qManager); 
     queue = qMgr.accessQueue(inputQName, openOptions); 

     while(getMore) 
     { 
     try 
     { 
      receiveMsg = new MQMessage(); 
      queue.get(receiveMsg, getOptions); 
      byte[] b = new byte[receiveMsg.getMessageLength()]; 
      receiveMsg.readFully(b); 
      System.out.println("Message-->" + new String(b)); 
     } 
     catch (MQException e) 
     { 
      if ((e.completionCode == CMQC.MQCC_WARNING) && 
       (e.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE)) 
      { 
       System.out.println("Bottom of the queue reached."); 
       getMore = false; 
      } 
      else 
      { 
       System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode); 
       getMore = false; 
      } 
     } 
     catch (IOException e) 
     { 
      System.out.println("MQRead " +e.getLocalizedMessage()); 
     } 
     } 
    } 
    catch (MQException e) 
    { 
     System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode); 
    } 
    finally 
    { 
     try 
     { 
     if (queue != null) 
      queue.close(); 
     } 
     catch (MQException e) 
     { 
     System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode); 
     } 
     try 
     { 
     if (qMgr != null) 
      qMgr.disconnect(); 
     } 
     catch (MQException e) 
     { 
     System.err.println("MQRead CC=" +e.completionCode + " : RC=" + e.reasonCode); 
     } 
    } 
} 
Смежные вопросы