我有一个带有输出绑定的HTTP触发函数,我使用IAsyncCollector<string> outputEventHubMessages
outputEventHubMessages.AddAsync("message")
将消息发送到事件中心。
如果由于某种原因,事件中心出现中断/暂停并且不接受该消息,Azure功能是否会重试发送?
感谢。
答案 0 :(得分:0)
根据我所见,HTTP绑定将向您返回500,以防另一个输出绑定无法完成其工作(例如连接到Event Hub)。它不会重试该操作。以下是响应正文的示例:
{
"id": "112a4e4f-2c6b-4b43-85a6-a8d801ca6f23",
"requestId": "0c0514e3-27dc-476f-8a85-3c8fe77aa762",
"statusCode": 500,
"errorCode": 0,
"message": "Exception while executing function: Functions.SoFunc -> Error while handling parameter outputEventHubMessage after function returned: -> Put token failed. status-code: 404, status-description: The messaging entity 'sb://tmdevmike.servicebus.windows.net/outeventhub' could not be found.."
}
我不能引用任何官方文档。
答案 1 :(得分:0)
在输出绑定中内置此功能会很不错。但是,以下代码段显示了向事件中心重试消息的示例。该概念基于在输出绑定上捕获错误并将消息发送到存储队列以进行重试过程:
[FunctionName("Function4")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestMessage req,
[EventHub("%EventHub%", Connection = "connectionEventHub")] IAsyncCollector<string> outputEventHubMessages,
[Queue("%RetryQueue%")] IAsyncCollector<string> outputQueueRetryMessages,
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
// Get request body
string message = JsonConvert.SerializeObject(JObject.Parse(await req.Content.ReadAsStringAsync()));
try
{
await outputEventHubMessages.AddAsync(message);
await outputEventHubMessages.FlushAsync();
}
catch(Exception ex)
{
log.Error(ex.Message);
//await Task.Delay(5000);
await outputQueueRetryMessages.AddAsync(message);
}
return req.CreateResponse(HttpStatusCode.OK);
}
可以在host.json文件中配置队列:
{
"queues": {
"maxDequeueCount": 3,
"visibilityTimeout": "00:00:30"
}
}