如果我日后使用以下方式安排邮件:
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
似乎比队列存储中的可见性超时更灵活,因此,如果可以的话,最好坚持使用它。
答案 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)