我正在使用下面的代码来接收来自队列的消息:
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节点存储库复制粘贴这个例子,在我的例子中,它产生了相同的行为:第一条消息已经被成功地接收到了,但是下面的总线请求返回“没有要接收的消息”。
发布于 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)发布于 2018-12-27 21:25:19
这是因为,默认情况下,在从azure门户创建新队列时选中“分区”复选框。在创建队列之前取消选中“分区”复选框。
出于某种原因,节点客户端在从队列中读取消息时似乎会从随机分区抓取。您将从一个空分区返回一个“没有要接收的消息”错误。我找不到任何说明如何在分区队列中使用node的文档。
编辑:
下面是一些解释分区的文档:https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-partitioning
经过深入研究,我发现rest客户端(节点客户端使用的内容)不支持会话,换句话说,您不能告诉客户端在从队列读取消息时使用哪个分区。
https://stackoverflow.com/questions/41417504
复制相似问题