代码之家  ›  专栏  ›  技术社区  ›  Gaurav Mantri

无法使用amqp和节点[重复]从azure服务总线队列“查看”消息

  •  1
  • Gaurav Mantri  · 技术社区  · 6 年前

    我正在尝试使用 nodeamqp10 但不幸的是我不能这么做。

    下面是我使用的代码:

    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 回复  |  直到 6 年前
        1
  •  0
  •   Arunprabhu    6 年前

    为了接收不带锁的消息,请设置 receiver-settle-mode 在创建接收器时处理的属性。

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

        2
  •  0
  •   Sunny Sharma    6 年前

    我认为发布这个消息可以解决这个问题:

    接收器。释放(消息);

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

    显然,我也可以通过消息选项来实现这一点。目前,它似乎是畸形的。

    var消息选项={' 应用程序属性 {操作〉:“com。微软:PEEK消息”};

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

    Custom Properties

    以下几点似乎很管用:

    Valm消息选项= {“操作”:'COM.微软:PEEK消息'};

    如果有帮助,请告诉我,谢谢。