[FunctionName("Function1")]
[ExponentialBackoffRetry(-1, "00:00:03", "00:00:30")]
public static async Task Run([EventHubTrigger("test", Connection = "EventHubConnection",
ConsumerGroup = "eventprocessor")] EventData[] events,
ILogger log)
{ }
Приведенная выше политика повторных попыток заставит функцию Azure EventHubTrigger повторить попытку при возникновении необработанного исключения. Если это так, как определить, что текущее выполнение функции является «повторным» выполнением или «нормальным», то есть выполнением следующего пакета?


Я попробовал приведенный ниже код, чтобы идентифицировать логику повторной попытки функции Azure с помощью метода ExponentialBackoffRetry и получить текущий контекст: -
Моя функция1.cs: -
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.EventHubs;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
namespace FunctionApp6
{
public static class Function1
{
[Function("Function1")]
[ExponentialBackoffRetry(5, "00:00:10", "00:10:00")]
public static async Task Run([EventHubTrigger("siliconeventhub", Connection = "EventHubConnection")] EventData[] events, RetryContext retryContext, ILogger log)
{
if (retryContext != null && retryContext.RetryCount > 0)
{
log.LogInformation($"Retry #{retryContext.RetryCount}");
}
else
{
log.LogInformation("Normal execution");
}
foreach (EventData eventData in events)
{
try
{
byte[] bytes = eventData.Body.ToArray();
string messageBody = Encoding.UTF8.GetString(bytes);
log.LogInformation($"Eventhub got a message: {messageBody}");
}
catch (Exception e)
{
log.LogError($"Error processing message: {e.Message}");
throw;
}
}
}
}
}
Альтернативный код с полными расширениями: -
using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.EventHubs;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
namespace FunctionApp6
{
public static class Function1
{
[Function("Function1")]
[Microsoft.Azure.Functions.Worker.ExponentialBackoffRetry(5, "00:00:10", "00:10:00")]
public static async Task Run([Microsoft.Azure.Functions.Worker.EventHubTrigger("siliconeventhub", Connection = "EventHubConnection")] EventData[] events, RetryContext retryContext, ILogger log)
{
if (retryContext != null && retryContext.RetryCount > 0)
{
log.LogInformation($"Retry #{retryContext.RetryCount}");
}
else
{
log.LogInformation("Normal execution");
}
foreach (EventData eventData in events)
{
try
{
byte[] bytes = eventData.Body.ToArray();
string messageBody = Encoding.UTF8.GetString(bytes);
log.LogInformation($"C# Event Hub got a message: {messageBody}");
}
catch (Exception e)
{
log.LogError($"Error processing message: {e.Message}");
throw;
}
}
}
}
}
Здесь, если контекст повторной попытки меньше нуля или NULL, это считается нормальным выполнением, а большее — повторным выполнением.
Выход:-
