我有azure function which trigger when we ave new message into service bus topic.
在azure函数中,我通过调用checked the customer api is available or not并检查它的status code来实现它。
如果状态代码为200,我需要处理该消息,否则,将此消息放入死信中,并在某个时间间隔后,当customer可用时,也处理所有死信消息。
public static class Function1
{
[FunctionName("Function1")]
public static void Run([ServiceBusTrigger("customer-order", "customer-order", Connection = "")]string mySbMsg, ILogger log)
{
// 1.call customer api to check it is available or not
// 2.if it is up and running then process the message else put message into dead-letter
// and after some interval when customer ai is available process dead-letter messages
log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}
}我还可以使用customer api和处理消息调用HTTPClient。
但是,当客户api可用时,如何将消息放入死信中,以及如何在某个时间间隔后执行死信?
提议的流程将是
在蔚蓝功能应用程序,它将触发,如果有新的消息进入。 主题启动步骤-检查api是否可用,如果api可用,则检查api。 如果api关闭,则不要处理当前消息 在这里我们有两个选择 1a.put当前消息变成死信,1b.put当前消息返回主,但如果我们这样做,那么函数应用程序将再次触发,因为它的新消息触发器的基础和启动步骤将继续。
发布于 2019-08-14 10:28:41
与其将其放入死信队列中,更好的方法是在一定时间内使用 the message。
如果由于处理该消息的特定资源暂时不可用但消息处理不应立即挂起而无法处理消息,则将该消息放在一边几分钟的一种方法是在预定的消息中记住要在几分钟内发布的SequenceNumber,并在预定消息到达时重新检索延迟的消息。
有关如何在Azure函数v2中执行延迟的示例,请参阅此v2。注意,输入绑定使用的是Message类型的消息,也使用的是注入的MessageReceiver。这些都需要能够调用DeferAsync。服务总线触发器的模板代码将消息类型设置为string,因此您必须更改该答案中描述的签名。
关于推迟的信息:
延迟消息与所有其他活动消息(与子队列中的死信消息不同)都保留在主队列中,但不能再使用常规的ReceiveAsync函数接收它们。要检索延迟消息,它的所有者负责在SequenceNumber延迟时记住它。任何知道延迟消息的序列号的接收者以后都可以显式地使用Receive(sequenceNumber)接收消息。
如何用延迟消息的序列号来调度消息,以便以后可以处理延迟消息:
您可以通过通过常规发送路径发送消息时设置ScheduledEnqueueTimeUtc属性,或者使用ScheduleMessageAsync API显式地调度消息。
https://stackoverflow.com/questions/57492305
复制相似问题