首页 > 解决方案 > 避免在 Orchestrator 功能中多次执行

问题描述

我在 Orchestrator 函数中有以下代码:


        [FunctionName("OrchestratorFunction")]
        public async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
        {               
            _log.LogMessageAsync(new LogMessage { Message = "OrchestratorFunction started" });
            var groups= await context.CallActivityAsync<AzureADGroup[]>("GroupsReaderFunction", null);
            try
            {
                if (groups.Length == 0)
                {
                    _ = _log.LogMessageAsync(new LogMessage { Message = "No source groups" });
                    _ = _calculator.SendEmailAsync();
                }
                else
                {                    
                    var processingTasks = new List<Task<List<AzureADUser>>>();
                    foreach (var group in groups)
                    {
                        var processTask = context.CallSubOrchestratorAsync<List<AzureADUser>>("SubOrchestratorFunction", group});
                        processingTasks.Add(processTask);
                    }
                    await Task.WhenAll(processingTasks);

                    var users = new List<AzureADUser>();
                    foreach (var task in processingTasks)
                        users.AddRange(await task);

                    distinctUsers = users.GroupBy(user => user.ObjectId).Select(userGrp => userGrp.First()).ToList();

                    _ = _log.LogMessageAsync(new LogMessage { Message = "Found users" });
                }
            }
            catch (Exception ex)
            {
              _ = _log.LogMessageAsync(new LogMessage { Message = "Caught unexpected exception"                });
              distinctUsers = null;
            }
            finally
            {
                if (distinctUsers != null)
                {
                    await context.CallActivityAsync("UsersSenderFunction", distinctUsers);
                }
                else
                {
                    await context.CallActivityAsync("JobStatusUpdaterFunction", null);
                }
            }
            _ = _log.LogMessageAsync(new LogMessage
            {               
                Message = distinctUsers != null ? "Successfully sent users from source groups":
                "Error while reading users from source groups"
            });
            if (!context.IsReplaying) _ = _log.LogMessageAsync(new LogMessage { Message = "OrchestratorFunction completed" });
        }
    }
}

这段代码的哪些部分应该移动到活动函数中以避免多次执行?

标签: azure-durable-functions

解决方案


推荐阅读