Javascript Azure ServiceBus:无法从队列接收消息

Javascript Azure ServiceBus:无法从队列接收消息,javascript,azure,azureservicebus,Javascript,Azure,Azureservicebus,我正在使用以下代码从队列接收消息: function startReceiver(){ serviceBusService.getQueue(configurations.queueForRequest, function(err, queue){ if(!err){ var length = queue.CountDetails['d2p1:ActiveMessageCount'];//get count of active messages if(length >

我正在使用以下代码从队列接收消息:

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#library及其接收消息的标准功能,效果非常好

这里怎么了?请帮忙


编辑:我只是从azure sdk for node repository复制粘贴,在我的情况下,它会产生相同的行为:第一条消息已成功接收,但以下对总线的请求返回“无需接收的消息”

当前,我可以生成您的问题,并检测到在某种复杂场景中,它应该是性能问题,该场景与从队列接收消息的
Peek Lock
模式有关

与在代码片段中一样,您使用
Peek Lock
模式接收消息,这将锁定队列的第一条消息(当队列传递消息FIFO时),因为
handleMessage()
函数中的
deleteMessage()
是一个asyn函数,因此node.js不会因此结果而挂起,将调用
startReceiver()
最后
部分中立即执行。在这种情况下,它可能会尝试接收锁定的消息并出现此问题

有两种操作可以尝试修复此问题:

  • 放大接收处理器的间隔时间,尝试将
    最后
    部分下的
    startReceiver()修改为
    setTimeout(startReceiver,3000)
  • 尝试使用
    read和delete
    receive模式,使用
    receiveQueueMessage(quene\u name,callback)
    而不是
    receiveQueueMessage(quene\u name,{isPeekLock:true},callback)

    • 我终于找到了解决这个问题的方法

      起初我认为原因是Node.js的Azure包过时了。 然而这不是真的

      当我手动创建队列时,即通过azure portal,我的node.js客户端工作错误(它无法接收消息)。 当使用代码(
      createQueueIfNotExists
      method)创建它时,没有任何问题


      它对我有效,但我不知道有关此行为的任何详细信息,我向团队询问了它们。

      这是因为,默认情况下,从azure门户创建新队列时选中了“分区”复选框。在创建队列之前,取消选中“分区”复选框

      出于某种原因,当从队列中读取消息时,节点客户端似乎从随机分区抓取。您将从空分区返回一个“无需接收的消息”错误。我找不到任何说明如何将NodeSDK用于分区队列的文档

      编辑:

      下面是一些解释分区的文档:


      经过一番挖掘,我发现rest客户端(节点客户端使用的)不支持会话,或者换句话说,在从队列中读取消息时,您无法告诉客户端要使用哪个分区。

      Hi@Mergasov,有什么更新吗?@Gary Liu-MSFT,我忘了这里的答案,抱歉。问题是我有一个过时的node js包。当我更新它时,我的代码是有效的。由于CORS,如何以编程方式创建队列?