Ejemplo n.º 1
0
        public async Task <TaskSessionsInfo> BizActionAsync(MazeTask inputData)
        {
            var builder = new TaskSessionInfoBuilder(inputData.Id);

            builder.TaskSessionAdded   += BuilderOnTaskSessionAdded;
            builder.TaskExecutionAdded += BuilderOnTaskExecutionAdded;
            builder.TaskResultAdded    += BuilderOnTaskResultAdded;

            var storage = new MemoryTaskResultStorage();

            //trigger locally
            await _management.TriggerNow(inputData, SessionKey.Create("Execute"), storage);

            builder.Add(new TaskSessionsInfo
            {
                Sessions   = storage.Sessions,
                Executions = storage.Executions,
                Results    = storage.CommandResults
            }, TargetId.ServerId);

            //trigger on clients
            var audienceFilter = new AudienceFilter(inputData.Audience);
            var clients        = (await _dbContext.Clients.Select(x => x.ClientId).ToListAsync()).ToHashSet();

            var onlineClients = _connectionManager.ClientConnections.Where(x => clients.Contains(x.Key));

            var tasks = new Dictionary <Task <TaskSessionsInfo>, int>();

            foreach (var onlineClient in onlineClients)
            {
                if (audienceFilter.Invoke(onlineClient.Key))
                {
                    //add all at once because the tasks don't do anything except waiting for the completion source anyways
                    var task = TasksResource.ExecuteTask(inputData, _taskComponentResolver, _xmlSerializerCache, onlineClient.Value);
                    tasks.Add(task, onlineClient.Key);
                }
            }

            while (tasks.Any())
            {
                var task = await Task.WhenAny(tasks.Keys);

                builder.Add(task.Result, new TargetId(tasks[task]));

                tasks.Remove(task);
            }

            return(builder.Build());
        }
Ejemplo n.º 2
0
        public async Task BizActionAsync(Guid inputData)
        {
            var task = (await _taskDirectory.LoadTasks()).FirstOrDefault(x => x.Id == inputData);

            if (task == null)
            {
                AddValidationResult(TaskErrors.TaskNotFound);
                return;
            }

            var sessionKey = SessionKey.CreateUtcNow("ManualTrigger");
            await _management.TriggerNow(task, sessionKey, new DatabaseTaskResultStorage(_serviceProvider));

            foreach (var status in _activeTasksManager.ActiveCommands.Where(x => !x.Key.IsServer))
            {
                if (status.Value.Tasks.Any(x => x.TaskId == inputData))
                {
                    if (_connectionManager.ClientConnections.TryGetValue(status.Key.ClientId, out var connection))
                    {
                        await TasksResource.TriggerTask(inputData, sessionKey, connection);
                    }
                }
            }
        }