Как определить, что выполнение функции Azure является повторной попыткой?

    [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 повторить попытку при возникновении необработанного исключения. Если это так, как определить, что текущее выполнение функции является «повторным» выполнением или «нормальным», то есть выполнением следующего пакета?

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
0
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попробовал приведенный ниже код, чтобы идентифицировать логику повторной попытки функции 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, это считается нормальным выполнением, а большее — повторным выполнением.

Выход:-

Другие вопросы по теме