从 azure 函数延迟或放弃消息服务总线队列

Defer or Abandon message servicebus queue from azure function

在我的场景中,我将消息发送到 ServiceBus 队列。我有一个正在该队列上触发的 azure 函数。该函数接收消息,使用其他 API 端点检查状态,如果已处理,我会发送一封电子邮件。但是当该请求的处理未完成时,我想将消息放入队列中(有一些延迟或在将来安排时间)以便函数再次接收相同的消息并再次检查。订单对我来说并不重要。

到目前为止我已经尝试过这些方法:

BrokeredMessage.Abandon() - 立即触发函数 - 不是理想的行为 BrokeredMessage.Abandon() 与 ScheduledEnqueueTimeUtc 属性 -- 相同的行为

BrokeredMessage.Defer() - 在这里我需要跟踪消息序列号以使用 OnReceive 接收消息 - 不方便(或者甚至可能在函数内?)

将相同的消息重新发送到队列,并将 ScheduledEnqueueTimeUtc 属性 设置为稍后的时间 - 为此,我需要再次引用队列客户端并发送消息 - 这种方法有效但感觉不对(因为我必须完成我收到的实际消息并从函数内发送另一条消息)。

此外,我尝试过使用 WebJobs 和 Azure 存储队列 - 我在那里遇到的问题几乎相同。

有没有更好的方法来完成这项工作?我也愿意使用其他方法。我不确定是否可以使用 LogicApp 实现类似的功能?

谢谢 桑杰

我认为最好的办法是发送一条新消息。为此,使用输出绑定和 return 具有适当 ScheduledEnqueueTimeUtc 值的 BrokeredMessage 实例。如果您在函数中将其作为 BrokeredMessage 获取,则可以 Clone 原始消息。 Propably,您将需要使用 ICollector 进行此输出绑定,因为您的输出是有条件的。

函数运行时根据函数执行结果调用 Complete/Abandon 方法本身,因此您不能在函数内部手动执行此操作。 Defer-Receive 组合也不支持。

同样的方法应该适用于存储队列。