如何从"PeekLock"中的Azure Service Bus队列中获取消息AMQP模式? [英] How to fetch messages from an Azure Service Bus Queue in "PeekLock" mode using AMQP?

查看:208
本文介绍了如何从"PeekLock"中的Azure Service Bus队列中获取消息AMQP模式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在尝试在Node应用程序中使用Azure Service Bus. 我们的要求是从队列中提取多条消息.

We're trying to consume Azure Service Bus in a Node application. Our requirement is to fetch multiple messages from a queue.

由于Azure Node的SDK不支持批量检索,因此我们决定使用AMQP.虽然我们可以按照此处所述使用查看邮件"来获取邮件(

Since Azure SDK for Node doesn't support batch retrieval, we decided to use AMQP. While we're able to fetch messages using Peek Messages as described here (https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-amqp-request-response#message-operations).

我们注意到的是,一旦获取消息,它们就会从队列中删除.我想知道是否有人了解我们如何使用AMQP和Node以"PeekLock"模式获取消息.对于AMQP,我们使用amqp10节点程序包( https://www.npmjs.com/package/amqp10 ).

What we are noticing is that as soon as messages are fetched, they are getting removed from the queue. I am wondering if anyone has an insight into how we can fetch messages in "PeekLock" mode using AMQP and Node. For AMQP, we're using amqp10 node package (https://www.npmjs.com/package/amqp10).

这是我们用来查看消息的代码:

Here's our code for peeking at the messages:

const AMQPClient = require('amqp10/lib').Client,
Policy = require('amqp10/lib').Policy;

const protocol = 'amqps';
const keyName = 'RootManageSharedAccessKey';
const sasKey = 'My Shared Access Key'
const serviceBusHost = 'account-name.servicebus.windows.net';
const uri = protocol + '://' + encodeURIComponent(keyName) + ':' + encodeURIComponent(sasKey) + '@' + serviceBusHost;
const queueName = 'test1';
var client = new AMQPClient(Policy.ServiceBusQueue);
client.connect(uri)
.then(function () {
    return Promise.all([
        client.createReceiver(queueName),
        client.createSender(queueName)
    ]);
})
.spread(function(receiver, sender) {
    console.log(receiver);
    console.log(sender);
    console.log('--------------------------------------------------------------------------');
    receiver.on('errorReceived', function(err) {
        // check for errors
        console.log(err);
    });
    receiver.on('message', function(message) {
        console.log('Received message');
        console.log(message);
        console.log('------------------------------------');
    });

    return sender.send([], {
        operation: 'com.microsoft:peek-message',
        'message-count': 5
    });
})
.error(function (e) {
    console.warn('connection error: ', e);
});

推荐答案

默认情况下,接收器在自动结算模式下工作,您必须将其更改为在结算时结算 :

By default receiver works in auto-settle mode, you have to change it to settle on disposition:

const { Constants } = require('amqp10')

// 
// ...create client, connect, etc...
//

// Second parameter of createReceiver method enables overwriting policy parameters
const receiver = client.createReceiver(queueName, {
  attach: {
    rcvSettleMode: Constants.receiverSettleMode.settleOnDisposition
  }
})

处理完邮件后,别忘了接受/拒绝/释放邮件:

Do not forget to accept/reject/release a message after processing it:

receiver.on('message', msg => {
  //
  // ...do something smart with a message...
  //

  receiver.accept(msg) // <- manually settle a message
})

这篇关于如何从"PeekLock"中的Azure Service Bus队列中获取消息AMQP模式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆