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

时间:2018-09-14 14:05:30

标签: azure azureservicebus azure-servicebus-queues

如果我日后使用以下方式安排邮件:

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/

基本上,我需要能够安排一条消息在以后排队,但是可以取消。理想情况下,我希望也可以查看所有将来计划的任务,但是仅存储一个ID(以后可用来删除排队的消息)就足够了。

Azure UI也显示了活动/计划的邮件的数量,这似乎表明应该有某种方式可以查看这些计划的邮件!

队列存储会更好吗?还是服务总线有某种可行的方法? ScheduledEnqueueTimeUtc似乎比队列存储中的可见性超时更灵活,因此,如果可以的话,最好坚持使用它。

2 个答案:

答案 0 :(得分:1)

您可以使用“ Microsoft.ServiceBus.Messaging”并按入队时间清除消息。接收消息,按ScheduledEnqueueTime进行过滤,并在特定时间将消息放入队列后进行清除。

Microsoft.ServiceBus.Messaging;

MessagingFactory messagesFactory = MessagingFactory.CreateFromConnectionString(connectionString);

var queueClient = messagesFactory.CreateQueueClient(resourceName,ReceiveMode.PeekLock);

var client = messagesFactory.CreateMessageReceiver(resourceName,ReceiveMode.PeekLock);

BrokeredMessage消息= client.Receive();

            if (message.EnqueuedTimeUtc < MessageEnqueuedDateTime)
            {
                message.Complete(); 
            }

答案 1 :(得分:0)

为完整起见,可以使用存储队列服务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)