通过WebJobs重新查询或删除Azure存储队列中的邮件

通过WebJobs重新查询或删除Azure存储队列中的邮件,azure,azure-table-storage,azure-webjobs,azure-storage-queues,Azure,Azure Table Storage,Azure Webjobs,Azure Storage Queues,我希望有人能澄清一些关于Azure存储队列及其与WebJobs交互的事情: 要执行重复的后台任务(即添加到队列一次,然后按设定的间隔重复),是否有方法更新队列触发器函数中传递的相同消息,以便将其租约(可见性)扩展为重新排队和避免到期的方法 通过上述重复性后台工作的模式,我还试图找到一种“按需”删除/终止工作的方法。由于这在WebJobs的上下文之外似乎不可能实现,因此我考虑将要删除的消息的messageId和PopReceive存储在表存储中作为持久缓存,然后在QueueTrigger函数中传递

我希望有人能澄清一些关于Azure存储队列及其与WebJobs交互的事情:

  • 要执行重复的后台任务(即添加到队列一次,然后按设定的间隔重复),是否有方法更新队列触发器函数中传递的相同消息,以便将其租约(可见性)扩展为重新排队和避免到期的方法

  • 通过上述重复性后台工作的模式,我还试图找到一种“按需”删除/终止工作的方法。由于这在WebJobs的上下文之外似乎不可能实现,因此我考虑将要删除的消息的messageId和PopReceive存储在表存储中作为持久缓存,然后在QueueTrigger函数中传递消息时执行表查找以执行DeleteMessage,这样信息就不会再重复了


  • 任何建议或提示都将不胜感激。干杯:)

    Azure存储队列用于存储Azure Webjob、WorkerRole等可能使用的邮件。Azure Webjobs SDK提供了与Azure存储(包括队列、表存储、Blob和服务总线)交互的简便方法。也就是说,您还可以拥有一个不使用Webjobs SDK且不与Azure存储交互的Azure Webjob。事实上,我确实运行了一个与SQLAzure数据库交互的Webjob

    我将简要解释Webjobs SDK如何与Azure队列交互。一旦消息到达队列(或被设置为“可见”,稍后将对此进行详细介绍),就会触发Webjob中的函数(假设您在连续模式下运行)。如果该函数返回时没有错误,则消息将被删除。如果出现问题,消息将返回队列进行再次处理。您可以相应地处理失败的消息。这是一个如何做到这一点的例子

    SDK将调用函数最多5次,以处理队列消息。如果第五次尝试失败,消息将被移动到中毒队列。可配置最大重试次数

    关于可见性,将消息添加到队列时,存在可见性超时属性。默认值为零。因此,如果您希望将来处理消息,可以通过将此属性设置为所需的值来完成(最多7天)

    可选。如果指定,必须使用2011-08-18或更新版本的x-ms-version提出请求。如果未指定,则默认值为0。指定相对于服务器时间的新可见性超时值(以秒为单位)。新值必须大于或等于0,并且不能大于7天。消息的可见性超时不能设置为晚于到期时间的值。visibilitytimeout应设置为小于生存时间值的值

    现在为您的应用程序提供建议

  • 我只想为您要完成的每个任务向队列中添加一条消息。显然,该消息将具有相关的处理信息。如果需要计划多个任务,可以运行计划的Webjob(根据您选择的计划),将消息添加到队列中。然后,您的连续Webjob将拾取该消息并对其进行处理
  • 为每个发送到队列的消息添加GUID。将该GUID存储在应用程序的其他域(数据库)中。因此,当您将消息出列以进行处理时,您要做的第一件事是检查数据库是否需要处理该消息。如果需要取消消息的执行,而不是将其从队列中删除,只需更新数据库中的GUID即可 还有更多信息


    希望这有帮助,

    至于问题的第一部分,您可以使用更新消息操作来延长消息的可见性超时

    更新消息操作可用于持续扩展 队列消息的不可见性。此功能在以下情况下非常有用: 您希望工作人员角色“租用”队列消息。例如,如果 工作人员角色调用获取消息并认识到它需要更多的时间 要处理消息,它可以不断扩展消息的 在处理之前不可见。如果工作人员角色失败 在处理过程中,消息最终会再次可见 另一个工人角色可以处理它

    您可以在此处查看REST API文档:

    对于问题的第二部分,实际上有多种方法,您将id/PopReceive存储为查找的方法是一种可能的选择,您实际上可以有一个Web作业专门用于接收不同队列上的消息(例如plz delete msg),然后发送包含“messageId”的消息此Web作业可以使用获取消息操作,然后将其删除。(您可以通过传递队列名称使作业成为通用作业!)


    感谢您的回复和详细信息。它没有明确回答我的第一个问题:消息租约可以在函数中扩展吗?不,我认为你不能。如果你这样做,我认为这不是一个好的做法。您可以从正在执行的函数中重新添加原始消息,visibilityTimeout最长为7天。