我们希望使用Azure Logic Apps定期清理ServiceBus DeadLetter队列。我们的想法是每天循环一次所有DeadLetter消息,并删除超过x天的消息。
我用“Get messages from a queue(peek lock)"实现了周期性的“Recurrence”任务。当它们满足我的条件时,它们就会被完成,因此会从队列中删除。这适用于数百条消息。但当我用数千条消息测试时,它开始返回在当前运行期间已经访问过的消息。我包括了一个条件,如果再次处理相同的messageId,则终止处理。
有没有一种方法可以实现我们想要的?所以,在所有的消息上循环,删除一些,保留一些,而不重复访问它们?
下面是流程的简化示意图。
的数据
2条答案
按热度按时间gz5pxeao1#
我认为问题在于你的For Each需要并发控制。(默认为20)从队列中,则For Each操作并行运行,并且这些操作(在For Each内)并没有等待所有的操作完成,然后退出循环并再次使用Do Until循环。(右侧的省略号),并将重复性程度降低到较低的数字。
lyr7nygr2#
最后,我们决定完全跳过Logic Apps。我们最终创建了二级队列,并将生命周期设置为所需的值(我们希望存档DL消息的时间)。我们关闭了向此二级队列的DL发送过期消息。然后我们将DL消息转发到此二级队列。这样就不需要更多的处理,也不需要定期触发任何逻辑。