2017-01-01 44 views
1

我與此代碼的工作消息從隊列中接收消息:Azure的ServiceBus:不能接收隊列

function startReceiver(){ 
serviceBusService.getQueue(configurations.queueForRequest, function(err, queue){ 
    if(!err){ 
    var length = queue.CountDetails['d2p1:ActiveMessageCount'];//get count of active messages 
    if(length > 0) {   
    serviceBusService.receiveQueueMessage(configurations.queueForRequest, {isPeekLock:true}, 
     function(error, lockedMessage){ HandleMessage(error, lockedMessage) }); 
    return; //get out from this method 
       } 
      } 
      else{ 
       console.log('Can not get queue'); 
      } 
     setTimeout(startReceiver, 3000);//if err or there are no messages then call this method later 
     });  
    } 

function handleMessage(err, msg){   
    var result; 
    if (!err){ 
    serviceBusService.deleteMessage(msg, function(deleteError){ 
      if(deleteError) { 
      console.log('Can not delete the message') 
      } 
      else{ 
      console.log('Msg has been deleted'); 
      } 
      });//delete the message which has been received 

    try{     
     result = GetResult(msg.body)   
    } 
    catch (er){ 
     result = GetResultWhenExp(); 
    } 
    finally{ 
     sendMessage(result); //send a response 
     startReceiver(); //repeat a receiver loop 
    } 

    }//!error 
    else{console.log('Error occured: '+err); 
    setTimeout(startReceiver, 3000); //repeat a receiver loop later 
    } 
} 

的問題是,我可以接受時的handleMessage()運行在第一時間的消息只要。進一步的startReceiver()可以獲得正確的活動消息數,但handleMessage()獲取的未定義消息總是作爲參數(即serviceBusService.receiveQueueMessage()失敗,錯誤是「沒有消息接收」)。

使用C#庫及其標準功能來接收消息的效果很好。

這裏有什麼問題?請幫助

編輯:我剛剛從Azure的SDK-的節點資源庫複製粘貼this example,在我的情況下,它產生相同的行爲:第一條消息已成功接收,但以下要求巴士返回「無消息接收「

+0

嗨@Mergasov,任何更新,但? –

+0

@Gary Liu - MSFT,我在這裏忘了答案,對不起。事情是我有一個過期的js節點包。當我更新它時,我的代碼是有效的。 – Mergasov

回答

1

目前,我可以產生您的問題,並檢測到它應該是某種複雜的情況下,性能問題與Peek-Lock模式接收隊列中的消息有關。

如在您的代碼段,可以使用Peek-Lock模式,以接收消息,這將鎖定隊列的第一個消息(如隊列傳送消息FIFO),如在你的handleMessage()功能的deleteMessage()是ASYN功能,所以節點。 js不會等待這個結果,請立即撥打finally部分中的startReceiver()。在這種情況下,它可能會嘗試收到鎖定的消息並引發此問題。

有兩種操作,您可以嘗試解決此問題:

  • 放大接收處理器的間隔時間,嘗試修改startReceiver()finally部分setTimeout(startReceiver, 3000);
  • 嘗試使用read and delete接收模式,使用receiveQueueMessage(quene_name,callback)而不是receiveQueueMessage(quene_name,{ isPeekLock: true },callback)
0

最後我發現如何解決這個問題。

起初我以爲原因是過時的Node.js的Azure包。 但事實並非如此。

當我手動創建隊列時,即通過天藍色的門戶,我的node.js客戶端工作不正常(無法接收消息)。 並且當它使用代碼(createQueueIfNotExists方法)創建時,沒有任何問題。

這對我有用,但我對這種行爲的細節一無所知,我問他們團隊。

相關問題