在我的场景中,我将消息发送到 ServiceBus 队列。我有一个在该队列上触发的天蓝色函数。该函数接收消息,使用其他 API 端点检查状态,如果已处理,我会发送一封电子邮件。但是,当该请求的处理未完成时,我想将消息放入队列中(在将来有一些延迟或预定时间),以便函数再次接收相同的消息并再次检查。顺序对我来说并不重要。
到目前为止我已经尝试过这些方法:
BrokeredMessage.Abandon() - 立即触发该函数 - 不理想的行为 BrokeredMessage.Abandon() 与 ScheduledEnqueueTimeUtc 属性 - 相同的行为
BrokeredMessage.Defer() - 在这里我需要跟踪消息序列号以使用 OnReceive 接收消息 - 不方便(甚至可能在函数内?)
将相同的消息重新发送到队列,并将 ScheduledEnqueueTimeUtc 属性设置为稍后时间 - 为此,我需要再次引用队列客户端并发送消息 - 这种方法可行,但感觉不对(因为我必须完成我收到的实际消息并从函数内发送另一条消息)。
此外,我尝试过使用 WebJobs 和 Azure 存储队列 - 与我在那里遇到的问题几乎相同。
有没有更好的方法来完成这个任务?我也愿意使用其他方法。我不确定我是否可以使用 LogicApp 实现类似的目标?
谢谢 桑杰
最佳答案
我认为你最好的选择是发送一条新消息。为此,请使用输出绑定(bind)并返回具有正确 ScheduledEnqueueTimeUtc
值的 BrokeredMessage
实例。如果您在函数中将其作为 BrokeredMessage
获取,则可以克隆
原始消息。您可能需要使用 ICollector
进行此输出绑定(bind),因为您的输出是有条件的。
函数运行时根据函数执行结果调用Complete
/Abandon
方法本身,因此您无法在函数内部手动执行此操作。也不支持 Defer
-Receive
组合。
同样的方法应该适用于存储队列。
关于azure-functions - 从 azure 函数推迟或放弃消息服务总线队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47418664/