触发Azure队列存储而不删除消息

时间:2017-05-24 15:11:15

标签: c# azure azure-functions

如何在"功能App"中保留一条消息。直到我决定删除它?

当我在c#中构建一个控制台应用程序时,我可以决定何时删除我读过的消息:

queue.DeleteMessage(msg);

我可以使用此程序自动读取队列:functions-create-storage-queue-triggered-function

问题是,像Azure说:

  
      
  1. 返回Storage Explorer,单击“刷新”并验证邮件是否已处理且不再在队列中。
  2.   

在这种情况下,我无法在功能完成后自行删除该消息。

我尝试Throw new Exception("failed");来模拟失败的功能,但无论如何都会删除该消息。

我希望将此消息保留在队列中,直到我决定将其删除(在功能结束时)。

1 个答案:

答案 0 :(得分:5)

  

我尝试Throw new Exception("failed");来模拟失败的功能,但无论如何都会删除该消息。

消息未被删除,无论visibility-timeout是几秒钟,它都不可见。您在WebJobs SDK的上下文中运行代码,这就是您无法自己调用.DeleteMessage()的原因。您只是被传递给消息,而不是队列客户端。

如果您的函数成功完成,那么函数运行时(WebJobs SDK)将删除该消息。

价:
https://stackoverflow.com/a/40011705/4148708
https://github.com/Azure/azure-webjobs-sdk/issues/1040

编辑: 出队计数也可以咬人。如果消息QueueName-poison属性达到5,WebJobs SDK会将消息移动到毒性队列(dequeueCount)。

请参阅此内容以获取更多信息:
https://github.com/Microsoft/azure-docs/blob/master/articles/app-service-web/websites-dotnet-webjobs-sdk-storage-queues-how-to.md#automatic-poison-message-handling