Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure服务总线队列:我可以管理/取消计划邮件吗?_Azure_Azureservicebus_Azure Servicebus Queues - Fatal编程技术网

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

Azure服务总线队列:我可以管理/取消计划邮件吗?,azure,azureservicebus,azure-servicebus-queues,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_

如果我在将来使用以下方式安排邮件:

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团队似乎意识到了这个用例,因为存储队列似乎具有类似以下功能:

基本上,我需要能够安排一个消息稍后排队,但这是可取消的。理想情况下,我也希望能够查看所有未来计划的任务,但只要能够存储一个可用于以后删除排队消息的id就足够了

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

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

是的,这是可能的


不知道NodeJS客户端是否支持它,但对于C#客户端,有一种替代我所描述的
scheduledQueueTimeUTC
方法。使用
QueueClient.ScheduleMessageAsync()
可以发送计划消息并获取
SequenceNumber
。然后可以使用
QueueClient.CancelScheduledMessageAsync(sequenceNumber)
在任何时间点取消消息

为了完整起见,这可以使用存储队列服务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
您可以使用“Microsoft.ServiceBus.Messaging”并按排队时间清除邮件。接收消息,按ScheduledEnqueueTime筛选,并在消息在特定时间排队后执行清除

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(); 
 }
Microsoft.ServiceBus.Messaging;
MessagingFactory MessagingFactory=MessagingFactory.CreateFromConnectionString(connectionString);
var queueClient=messagingFactory.CreateQueueClient(resourceName,ReceiveMode.PeekLock);
var client=messagingFactory.CreateMessageReceiver(resourceName,ReceiveMode.PeekLock);
BrokeredMessage=client.Receive();
if(message.EnqueuedTimeUtc
接受此答案,谢谢!我还提出了一个github问题:在pythonsdk(我目前正在使用的)上,C#one使用了不同的API,他们正在重写Python one以实现同样的长期目标。目前,虽然我认为它只存在于C#one中,但由于代理能够实现这一功能(它确实支持C#client),因此在准备就绪之前,这是一个时间问题。同时,ASQ(建议如下)或ASB使用.NET标准客户端将是一种选择。根据您需要的信息功能的多少,ASQ可能不适合您,但这是您的电话谢谢您分享!如果您已经有任务排队,但没有序列号,那么这将非常有用。我认为,对于调度新任务的情况,接受的答案更好,不过如果您已经在使用AMQP版本——最终我转向了具有AMQP集成的Java SDK。
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(); 
 }