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)代码>
- 尝试使用
receive模式,使用read和delete
而不是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,如何以编程方式创建队列?