예제 #1
0
 public WorkflowTaskCoordinator(ConductorApi conductorApi,
                                IServiceProvider serviceProvider,
                                ILogger <WorkflowTaskCoordinator> logger)
 {
     ConductorApi    = conductorApi;
     ServiceProvider = serviceProvider;
     Logger          = logger;
 }
예제 #2
0
 public WorkflowTaskCoordinator(ConductorApi conductorApi,
                                IServiceProvider serviceProvider,
                                ILogger <WorkflowTaskCoordinator> logger,
                                IConductorApiExceptionHandler conductorApiExceptionHandler = null)
 {
     ConductorApi    = conductorApi;
     ServiceProvider = serviceProvider;
     ConductorApiExceptionHandler = conductorApiExceptionHandler;
     Logger = logger;
 }
예제 #3
0
        public ConductorApi HandleException(Exception exception, ConductorApi conductorApi)
        {
            Logger.LogError("Error calling Conductor api");

            try
            {
                Logger.LogInformation("Attempting to recover..");

                // Simulate api discovery
                var conductorApiUrl = "http://localhost:8080";

                conductorApi = RestService.For <ConductorApi>(conductorApiUrl);

                Logger.LogInformation("New Conductor api address found: {conductorApi}", conductorApiUrl);

                return(conductorApi);
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "Unable to recover");
                return(null);
            }
        }
예제 #4
0
        public async Task PollConductorQueue(string taskDomain)
        {
            try
            {
                // See if any tasks are ready to be picked up
                Logger.LogInformation("Polling Conductor queue (task domain: {TaskDomain})", taskDomain);
                var queue = await ConductorApi.GetQueue();

                foreach (var(taskTypeName, queuedCount) in queue)
                {
                    if (queuedCount > 0)
                    {
                        var taskName = taskTypeName;

                        // We're not interested in system tasks
                        if (SystemTasks.Contains(taskName))
                        {
                            Logger.LogDebug("Task {TaskName} is a system task. Skipping", taskName);
                            continue;
                        }

                        Logger.LogDebug("Determining eligibility of task {TaskName}", taskName);

                        // We're only interested in tasks within our domain
                        if (taskDomain != null)
                        {
                            if (!taskName.StartsWith(taskDomain))
                            {
                                continue;
                            }

                            // Get rid of the domain prefix
                            Logger.LogDebug("Removing task domain {TaskDomain} from task {TaskName}", taskDomain, taskName);

                            taskName = taskName.Replace($"{taskDomain}:", "");
                        }

                        // We're only interested in the tasks we registered
                        if (!SupportedTaskTypes.TryGetValue(taskName, out Type taskType))
                        {
                            Logger.LogInformation("Task {TaskName} is not registered with this worker. Skipping", taskName);
                            continue;
                        }

                        // Get more information on the task
                        Logger.LogInformation("Polling task {TaskName}", taskName);
                        var conductorTask = await ConductorApi.GetTask(taskName, taskDomain);

                        if (conductorTask == null)
                        {
                            continue;
                        }

                        var taskId = conductorTask.TaskId;

                        // Tell Conductor we're picking up the task
                        Logger.LogDebug("Sending acknowledgement for task {TaskId} ({TaskName})", taskId, taskName);
                        var isAcknowledgementSuccess = await ConductorApi.SendAcknowledgement(taskId);

                        if (!isAcknowledgementSuccess)
                        {
                            continue;
                        }

                        try
                        {
                            // Process task
                            Logger.LogInformation("Processing task {TaskId} ({TaskName})", taskId, taskName);
                            var workflowTask = (IWorkflowTask)ServiceProvider.GetService(taskType);
                            var taskResult   = await workflowTask.Execute(conductorTask);

                            // Tell Conductor processing succeeded
                            Logger.LogInformation("Updating status for task {TaskId} ({Status})", taskId, taskResult.Status);
                            await ConductorApi.UpdateTask(taskResult);
                        }
                        catch (Exception ex)
                        {
                            // Tell Conductor processing failed
                            var taskResult = conductorTask.FailedWithTerminalError(ex);
                            Logger.LogInformation("Updating status for task {TaskId} ({Status})", taskId, taskResult.Status);
                            await ConductorApi.UpdateTask(taskResult);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.LogError(ex, "Error calling Conductor api");
            }
        }