不可以。可能会发生以下情况:
- 获取消息()
- 在数据库中添加一些记录...
- 生成一些文件...
- DeleteMessage() -> 意外失败(进程崩溃、实例重启、网络连接问题……)
在这种情况下,您的逻辑在没有调用 DeleteMessage 的情况下被执行。这意味着,一旦隐身超时到期,消息将出现在队列中并再次被处理。您需要确保您的进程是幂等的:
幂等性是数学和计算机科学中某些运算的属性,它们可以多次应用而不会改变超出初始应用的结果。
另一种解决方案是将服务总线队列与ReceiveAndDelete模式一起使用(请参阅如何从队列接收消息下的此页面)。如果您收到该消息,它将被标记为已使用并且不再出现。这样您就可以确保它是At-Most-Once交付的(请参阅此处与 Storage Queues 的比较)。但是话又说回来,如果您在处理消息时发生了某些事情(即:服务器崩溃,...),您可能会丢失有价值的信息。
更新:
这将模拟存储队列中的 At-Most-Once。消息可以通过 GetMessage 多次到达,但只会由您的业务逻辑处理一次(存在您的某些业务逻辑永远不会执行的风险)。
- 获取消息()
- 删除消息()
- AddRecordsToDatabase()
- 生成文件()