Как вызвать функцию Durable по триггеру таймера?

Я новичок в функции Durable (функция оркестрации) и видел образец приложения в соответствии с документацией Microsoft, поэтому у меня мало сомнений.

пример:

public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, methods: "post", 
            Route = "orchestrators/{functionName}")] HttpRequestMessage req,
            [OrchestrationClient] DurableOrchestrationClient starter,
            string functionName,
            TraceWriter log)
        {
            // Function input comes from the request content.
            dynamic eventData = await req.Content.ReadAsAsync<object>();
            string instanceId = await starter.StartNewAsync(functionName, eventData);

            log.Info($"Started orchestration with ID = '{instanceId}'.");

            return starter.CreateCheckStatusResponse(req, instanceId);
        } 

чтобы вызвать его, я сделал HTTP-запрос POST с помощью почтальона, поэтому запрос был успешно обработан, но когда я настроил другой глагол, например HTTP GET, он получил ответ с ошибкой NotFound в консоли, а также запрос, сделанный к нему с HTTP-запросом из браузера, ответил с ошибкой «NotFound» в консоли. Почему это произошло?

Могу ли я вызвать любую функцию оркестрации с помощью функции лазурного триггера таймера?

Если нет, то почему?

ОБНОВЛЕНИЕ:

Некоторые дополнительные сведения о вопросе

    [FunctionName("TimerTrigger")]
            public static async Task Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, TraceWriter log)
            {//this runs for every 5minutes
                using (HttpClient client = new HttpClient())
                {
                    var content = new FormUrlEncodedContent(new[]
                {
                    new KeyValuePair<string, string>("", "")
                });
               //making request to above function by http trigger
                    var result = await client.PostAsync("http://localhost:7071/orchestrators/E1_HelloSequence", content);
                }
                log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
                return;
            }

Могу ли я сделать запрос на триггер http по срабатыванию таймера, почему, потому что моя долговечная функция имеет длительный процесс, поэтому, если вызвать функцию оркестрации в самом триггере таймера, может возникнуть вероятность тайм-аута, запускаемого таймером, поэтому я пытаюсь следовать этому подходу. можно вызвать по приведенному выше коду?


person Kumari Dimple    schedule 17.10.2017    source источник


Ответы (3)


Это общее поведение функций Azure. Причина, по которой GET не работает, заключается в том, что функция в примере настроена только для работы с POST. См. Атрибут [HttpTrigger] в сигнатуре функции:

[HttpTrigger(AuthorizationLevel.Anonymous, methods: "post", 
        Route = "orchestrators/{functionName}")]

Если вы хотите поддерживать GET, измените параметр methods соответствующим образом:

[HttpTrigger(AuthorizationLevel.Anonymous, methods: "get", 
        Route = "orchestrators/{functionName}")]

Обратите внимание, что в Visual Studio, похоже, есть ошибка кеширования, из-за которой внесение изменений в информацию о маршруте не сохраняется должным образом при локальной отладке. Я открыл проблему GitHub, чтобы отследить это здесь: https://github.com/Azure/Azure-Functions/issues/552

Дополнительные сведения о триггерах HTTP см. В этой документации: https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook

Если вы хотите запустить долговечную функцию с помощью триггера таймера, просто измените тип триггера. Например:

[FunctionName("ScheduledStart")]
public static async Task RunScheduled(
    [TimerTrigger("0 0 * * * *")] TimerInfo timerInfo,
    [OrchestrationClient] DurableOrchestrationClient starter,
    TraceWriter log)
{
    string functionName = "E1_HelloSequence";
    string instanceId = await starter.StartNewAsync(functionName, null);
    log.Info($"Started orchestration with ID = '{instanceId}'.");
}

РЕДАКТИРОВАТЬ: если вы используете Durable v2.x, синтаксис выглядит следующим образом:

[FunctionName("ScheduledStart")]
public static async Task RunScheduled(
    [TimerTrigger("0 0 * * * *")] TimerInfo timerInfo,
    [DurableClient] IDurableClient starter,
    ILogger log)
{
    string functionName = "E1_HelloSequence";
    string instanceId = await starter.StartNewAsync(functionName, null);
    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
}

Дополнительную информацию о триггерах таймера см. В этой документации: https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer

person Chris Gillum    schedule 17.10.2017
comment
Просто примечание, на случай, если кто-то придет и попытается скопировать + мимо этого кода. Похоже, связыватель OrchestrationClient был переименован в DurableClient, а интерфейс ILogger теперь используется вместо TraceWriter - person luizs81; 31.08.2020
comment
Спасибо @ luizs81. Я обновил свой ответ образцом для Durable v2.x. - person Chris Gillum; 01.09.2020
comment
@ChrisGillum. Можно ли использовать TimerTrigger в функциях Orchestrator напрямую, а не через [DurableClient]? - person Pingpong; 03.06.2021
comment
@ luizs81 можно ли использовать TimerTrigger для функций Orchestrator напрямую, а не через [DurableClient]? - person Pingpong; 03.06.2021
comment
@ Пинг-понг Я не уверен. Может быть, вы можете попробовать и сообщить нам;) - person luizs81; 03.06.2021
comment
@Pingpong нет, функция может иметь только один триггер. У вас может быть другая функция, которая использует TimerTrigger и вызывает функцию оркестратора, или вы можете периодически перезапускать функцию оркестратора, используя CreateTimer и ContinueAsNew для получения аналогичного эффекта. - person Chris Gillum; 07.06.2021

когда я настроил другой глагол, например HTTP GET, он получил ответ об ошибке NotFound в консоли, а также запрос, сделанный к нему с помощью HTTP-запроса из браузера, ответил с ошибкой «NotFound» в консоли. Почему это произошло?

Поскольку вы указали, что ваша функция запускается только при POST:

[HttpTrigger(AuthorizationLevel.Anonymous, methods: "post", 
Route = "orchestrators/{functionName}")] HttpRequestMessage req,

Чтобы включить GET, добавьте get к параметру methods.

Могу ли я вызвать любую функцию оркестрации с помощью функции лазурного триггера таймера?

Вы можете определить функцию, запускаемую таймером, с OrchestrationClient привязкой ввода, аналогичной вашей функции HTTP. Образец декларации:

public static async Task Run(
    [TimerTrigger("0 */1 * * * *")] TimerInfo info,
    [OrchestrationClient] DurableOrchestrationClient starter)
person Mikhail Shilkov    schedule 17.10.2017

Больше информации:

IDurableClient - это объединение IDurableEntityClient и IDurableOrchastrationClient. В нем есть все методы двух других.

Методы сущности:

CleanEntityStorageAsync (Boolean, Boolean, CancellationToken)
ListEntitiesAsync (EntityQuery, CancellationToken)
ReadEntityStateAsync (EntityId, String, String)
SignalEntityAsync (EntityId, DateTime, String), Object, Object /> SignalEntityAsync (EntityId, String, Object, String, String)
SignalEntityAsync (EntityId, Action)
SignalEntityAsync (EntityId, DateTime, Action)
SignalEntityAsync (String, Action)
SignalEntityAsync (строка, DateTime, действие)

Методы оркестровки:

CreateCheckStatusResponse (HttpRequest, String, Boolean)
CreateCheckStatusResponse (HttpRequestMessage, String, Boolean) CreateHttpManagementPayload (String)
GetStatusAsync (String, Boolean, Boolean, BooleanceAsync) ListIn DateTime, Nullable, IEnumerable)
PurgeInstanceHistoryAsync (String)
RaiseEventAsync (String, String, Object)
RaiseEventAsync (String, String, String, Object, String)
RestartAsync (String, Boolean)
StartNewAsync (String, String)
StartNewAsync (String, String, T)
StartNewAsync (String, T)
TerminateAsync (String, String)
WaitForCompletionOrCreateCheckStatusResponseAsync ( HttpRequest, String, Nullable, Nullable, Boolean)
WaitForCompletionOrCreateCheckStatusResponseAsync (HttpRequestMessage, String, Nullable, Nullable, Boolean)

https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.webjobs.extensions.durabletask?view=azure-dotnet

person TomF    schedule 12.03.2021