在我的场景中,我将消息发送到ServiceBus队列。我有一个在该队列上触发的azure函数。该函数接收消息,使用其他API端点检查状态,如果已处理,则发送电子邮件。但是当该请求的处理未完成时,我想将消息放在队列中(稍后会有一些延迟或预定的时间),以便该功能再次接收相同的消息并再次检查。订单对我来说并不重要。
到目前为止,我尝试过这些方法:
BrokeredMessage.Abandon() - 它会立即触发函数 - 不是理想的行为 BrokeredMessage.Abandon()与ScheduledEnqueueTimeUtc属性 - 相同的行为
BrokeredMessage.Defer() - 在这里我需要跟踪消息序列号以使用OnReceive接收消息 - 不方便(甚至可能在函数内?)
将相同的消息重新发送到队列,并将ScheduledEnqueueTimeUtc属性设置为以后的时间 - 为此我需要再次引用Queue Client并发送消息 - 这种工作但感觉不对(因为我必须完成我收到的实际消息,并从函数内发送另一条消息)。
此外,我尝试过使用WebJobs和Azure存储队列 - 我在那里遇到的问题几乎相同。
有没有更好的方法来完成这项工作?我也愿意使用其他方法。我不确定我是否能用LogicApp实现类似的功能?
由于 桑杰
答案 0 :(得分:2)
我认为您最好的选择是发送新邮件。为此,使用输出绑定并返回BrokeredMessage
的实例,其值为ScheduledEnqueueTimeUtc
。如果您在函数中将Clone
作为BrokeredMessage
,则可以ICollector
原始邮件。适当地,您需要使用Complete
来进行此输出绑定,因为您的输出是有条件的。
根据函数执行结果函数运行时调用Abandon
/ Defer
方法本身,因此您无法在函数内手动执行此操作。 Receive
- dict
组合也不受支持。
同样的方法应该适用于存储队列。