无法使用AMQP和Node从Azure Service Bus队列“窥视”消息

时间:2018-07-24 16:24:28

标签: node.js azure amqp azureservicebus azure-servicebus-queues

我正在尝试使用nodeamqp10库从Azure Service Bus队列中“窥视”消息,但是很遗憾,我无法这样做。

这是我正在使用的代码:

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

const protocol = 'amqps';
const keyName = 'MyPolicy';
const sasKey = 'My SAS Key'
const serviceBusHost = 'account.servicebus.windows.net';
const uri = protocol + '://' + encodeURIComponent(keyName) + ':' + encodeURIComponent(sasKey) + '@' + serviceBusHost;
const queueName = 'queue-name';
const policy = Policy.ServiceBusQueue;
policy.receiverLink.attach.rcvSettleMode = 1;
var client = new AMQPClient(policy);
client.connect(uri)
.then(function () {
    return Promise.all([
        client.createReceiver(queueName),
        client.createSender(queueName)
    ]);
})
.spread(function(receiver, sender) {
    sender.on('errorReceived', function (tx_err) { console.warn('===> TX ERROR: ', tx_err); });
    receiver.on('errorReceived', function (rx_err) { console.warn('===> RX ERROR: ', rx_err); });
    receiver.on('message', function(message) {
        console.log('Received message');
        console.log(message);
        console.log('------------------------------------');
        messages.push(message);
    });
    var messageOptions = {
      'applicationProperties': {
        'operation': 'com.microsoft:peek-message'
      }
    };
    return sender.send({}, messageOptions);
})
.error(function (e) {
    console.warn('connection error: ', e);
});

此代码很少发生我无法理解的事情:

  1. 上面的代码获取消息,但是它以Peek/Lock模式获取消息,即,每次我运行代码时,消息的传递计数都增加了一个,这不是我想要的。
  2. 上面的代码每次运行时都会在队列中插入一条消息。我只想从队列中获取消息,而不插入任何新消息。

我已经阅读了文档here,并根据此文档将operation中的com.microsoft:peek-message指定为applicationProperties,这只能允许查看消息,而不能查看和锁定它们。

有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

为了接收不带锁的消息,请在创建接收者时将receiver-settle-mode属性设置为根据处置而定。

回答第二个问题,您为队列创建了一个发送方,该发送方在编译消息时发送该消息。要停止发送消息,只需删除发件人和相关代码。

答案 1 :(得分:0)

我认为发布消息将解决问题:

  

receiver.release(message);

......

 receiver.on('message', function(message) {
        console.log('Received message');
        console.log(message);
        console.log('------------------------------------');
        messages.push(message);

        receiver.release(message);  

 });
.......

显然,我也可以通过messageOptions实现此目的。目前,它似乎格式不正确。

  

var messageOptions = {' applicationProperties ':{'operation':'com.microsoft:peek-message'}};

applicationProperties 与任何可用的配置属性都不匹配,因此将其添加到消息的“自定义属性”中。

Custom Properties

以下似乎很好用:

  

var messageOptions = {'operation':'com.microsoft:peek-message'};

请告诉我是否有帮助,谢谢。