首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure ServiceBus:无法从队列接收消息

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

Stack Overflow用户
提问于 2017-01-01 17:36:24
回答 2查看 2.1K关注 0票数 1

我正在使用下面的代码来接收来自队列的消息:

代码语言:javascript
复制
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()总是以参数的形式获得未定义的msg (即serviceBusService.receiveQueueMessage()失败,错误是“无要接收的消息”)。

使用C#库及其接收消息的标准功能,效果很好。

这里怎么了?请帮帮忙

编辑:我只是从azure-sdk节点存储库复制粘贴这个例子,在我的例子中,它产生了相同的行为:第一条消息已经被成功地接收到了,但是下面的总线请求返回“没有要接收的消息”。

EN

回答 2

Stack Overflow用户

发布于 2017-01-02 06:27:56

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

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

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

  • 扩大接收处理器的间隔时间,尝试将startReceiver()finally部分修改为setTimeout(startReceiver, 3000);
  • 尝试使用read and delete接收模式,使用receiveQueueMessage(quene_name,callback)而不是receiveQueueMessage(quene_name,{ isPeekLock: true },callback)
票数 1
EN

Stack Overflow用户

发布于 2018-12-27 21:25:19

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

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

编辑:

下面是一些解释分区的文档:https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning

经过深入研究,我发现rest客户端(节点客户端使用的内容)不支持会话,换句话说,您不能告诉客户端在从队列读取消息时使用哪个分区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41417504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档