【问题标题】:Unable to "Peek" messages from an Azure Service Bus Queue using AMQP and Node [duplicate]无法使用 AMQP 和节点从 Azure 服务总线队列“窥视”消息 [重复]
【发布时间】:2023-04-06 18:07:02
【问题描述】:

我正在尝试使用 nodeamqp10 库从 Azure 服务总线队列中“窥视”消息,但不幸的是我无法这样做。

这是我正在使用的代码:

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 的文档,基于此,我在applicationProperties 中将operation 指定为com.microsoft:peek-message,这应该只允许查看消息而不是查看和锁定消息。

谁能告诉我我在这里做错了什么?

【问题讨论】:

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


    【解决方案1】:

    为了在没有锁的情况下接收消息,设置receiver-settle-mode 属性以在创建接收器时确定处置。

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

    【讨论】:

    • 谢谢!我在代码中的接收器上设置receiver-settle-mode 属性(policy.receiverLink.attach.rcvSettleMode = 1;)。关于第二部分,如果我不创建发件人,我将如何/在哪里设置应用程序属性?
    • 可以在不设置应用属性的情况下尝试接收吗?
    • 谢谢!因此,根据您的回答,我删除了与发件人相关的代码。我仍然能够接收消息,但再次以 peek-lock 模式获取消息。我的最新代码可以在这里找到:pastebin.com/18zduzEr.
    • 我认为您需要将 rcvSettleMode 设置为 0,因为 1 用于带锁的消息,请参阅docs.microsoft.com/en-us/azure/service-bus-messaging/…
    • 我不这么认为。当我们将此模式设置为0 时,会获取消息但会从队列中删除(因为它们被视为已解决)。
    【解决方案2】:

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

    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 与任何可用的配置属性都不匹配,因此它被添加到消息的“自定义属性”中。

    以下似乎工作正常:

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

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

    【讨论】:

    • 谢谢桑尼!您是否可以分享您的完整代码。我记得我试图发布消息,但在那种情况下,同样的消息被一遍又一遍地发送。
    • 抱歉回复晚了,是的 - 使用“释放”它会一​​遍又一遍地返回相同的消息。似乎是一个错误!
    • 谢谢桑尼!让我向 Service Bus 团队寻求帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 2014-11-03
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多