代码之家  ›  专栏  ›  技术社区  ›  Callum M

Azure服务总线队列:我可以管理/取消计划的消息吗?

  •  0
  • Callum M  · 技术社区  · 6 年前

    如果我在将来计划一条消息时使用以下内容:

    d = datetime.utcnow() + timedelta(minutes=5)
    task = {"some": "object"}
    
    sbs.send_queue_message(
        qn,
        Message(
            task, 
            broker_properties={'ScheduledEnqueueTimeUtc': d}
        )
    )
    

    那么,是否有一种方法可以查看/删除已安排的邮件? send_queue_message receive_queue_message 不返回计划稍后排队的项目是可以理解的,因此我无法将其传递给 delete_queue_message

    Azure团队似乎意识到了这个用例,因为存储队列似乎具有如下功能: https://azure.microsoft.com/en-gb/blog/azure-storage-queues-new-feature-pop-receipt-on-add-message/

    azureui也显示了活动/计划消息的计数,这似乎表明应该有某种方法来查看那些计划消息!

    ScheduledEnqueueTimeUtc

    3 回复  |  直到 6 年前
        1
  •  6
  •   Sean Feldman    6 年前

    是的,有可能。

    不知道NodeJS客户端是否支持它,但是对于C#client,有一种替代方法 ScheduledEnqueueTimeUtc here . 使用 QueueClient.ScheduleMessageAsync() 您可以发送一条预定的消息并获取 SequenceNumber . 然后可以在任何时间点使用 QueueClient.CancelScheduledMessageAsync(sequenceNumber) .

        2
  •  1
  •   StuartLC    5 年前

    Microsoft.ServiceBus.Messaging;
    
    MessagingFactory messagingFactory =  MessagingFactory.CreateFromConnectionString(connectionString);
    
    var queueClient = messagingFactory.CreateQueueClient(resourceName, ReceiveMode.PeekLock);
    
    var client = messagingFactory.CreateMessageReceiver(resourceName, ReceiveMode.PeekLock);
    
    BrokeredMessage message = client.Receive();
    
    if (message.EnqueuedTimeUtc < MessageEnqueuedDateTime)
     {
             message.Complete(); 
     }
    
        3
  •  0
  •   Callum M    6 年前

    为了完整起见,可以使用存储队列服务Python SDK完成这项工作:

    from azure.storage.queue import QueueService
    account_name = '<snip>'
    account_key = '<snip>'
    queue_service = QueueService(account_name=account_name, account_key=account_key)
    a = queue_service.put_message('queue_name', u'Hello World (delete)', visibility_timeout=30)
    print(a.id) # id
    print(a.pop_receipt) # pop_receipt
    

    然后在可见性超时过期之前的另一个Python实例中:

    queue_service.delete_message('queue_name', id, pop_receipt)