Azure Durable Function - 在 Orchestrator 中执行

Azure Durable Function - Do While in Orchestrator

我有一个调用 activity 函数来处理客户 ID 的编排器 此 activity returns 错误 ID 的输出(如果有的话),我希望通过再次执行 activity 来重新处理这些 ID,直到没有错误 ID(输出为空)。

为编排器设置一个 do 循环是一种好习惯吗? 如何在每次执行 activity 之前延迟 5 分钟?

public static async Task<string> RunOrchestrator(
        [OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
    {
        log = context.CreateReplaySafeLogger(log);
        
        dynamic errorOutput = null;
        dynamic processCustomers = context.GetInput<dynamic>();
        log = context.CreateReplaySafeLogger(log);

        do
        {
            log.LogInformation("Calling activity");
            errorOutput = await context.CallActivityAsync<dynamic>("GetCSPCustomerLicenses_Activity", processCustomers);

            //Get customers to process from error object                   
            processCustomers = errorOutput;
            
           //Wait 5 minutes - how do I achieve this ?

        } while (errorOutput != null);

        return "Success";
    }

也许你可以使用持久定时器来延迟执行,请先参考Timers in Durable Functions (Azure Functions)

Durable Functions provides durable timers for use in orchestrator functions to implement delays or to set up timeouts on async actions. Durable timers should be used in orchestrator functions instead of Thread.Sleep and Task.Delay (C#), or setTimeout() and setInterval() (JavaScript), or time.sleep() (Python).

这是延迟使用的代码示例:

public static async Task<string> RunOrchestrator(
        [OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
    {
        log = context.CreateReplaySafeLogger(log);
        
        dynamic errorOutput = null;
        dynamic processCustomers = context.GetInput<dynamic>();
        log = context.CreateReplaySafeLogger(log);

        do
        {
            log.LogInformation("Calling activity");
            errorOutput = await context.CallActivityAsync<dynamic>("GetCSPCustomerLicenses_Activity", processCustomers);

            //Get customers to process from error object                   
            processCustomers = errorOutput;
            
            //Wait 5 minutes - how do I achieve this ?
            DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromMinutes(5));
            await context.CreateTimer(deadline, CancellationToken.None);
        } while (errorOutput != null);

        return "Success";
    }