2017-01-01 41 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方法)创建时,没有任何问题。

这对我有用,但我对这种行为的细节一无所知,我问他们团队。

相关问题