/// <summary> /// Начинает опрос нодов, которые можно опросить - вычислители и, например, матриксы /// </summary> /// <param name="what"></param> /// <param name="nodes"></param> /// <param name="args"></param> /// <param name="priority"></param> public void CreateTasks(string what, IEnumerable <PollNode> nodes, dynamic args, int priority) { List <PollTask> tasks = new List <PollTask>(); logger.Debug($"назначена задача {what} для {nodes.Count()} нодов"); foreach (var node in nodes.Where(n => !n.IsDisabled())) { //аргументы задачи = аргументы нода (networkAddress и т.п) + аргументы опроса (start, end, components) dynamic arguments = FillArgs(node.GetArguments(), args); //создание задачи для помещения в очередь string createText = $"создание задачи {what} для {node.GetId()} с приоритетом {priority}"; var task = new PollTask(what, node, arguments, node.GetPaths(), priority); if (!task.HasPaths()) { logger.Trace("{0}: отсутствует возможность связаться с вычислителем", createText); if (task.Priority != PollTask.PRIORITY_AUTO) { node.Log("задача отклонена, отсутствует возможность связаться с вычислителем"); } return; } logger.Trace("{0}: добавлено в очередь", createText); tasks.Add(task); } //добавление задач в очередь AddTasks(tasks); }
public void CreateTasksIterative(string what, IEnumerable <PollNode> nodes, dynamic args, int priority) { List <PollTask> tasks = new List <PollTask>(); var nds = nodes.Where(n => !n.IsDisabled()).ToArray(); logger.Debug(string.Format("назначена задача {0} для {1} нодов", what, nds.Count())); var cntr = 0; foreach (var node in nds) { //сбор аргументов задачи dynamic arguments = FillArgs(node.GetArguments(), args); var task = new PollTask(what, node, arguments, node.GetPaths(), priority); if (!task.HasPaths()) { if (task.Priority != PollTask.PRIORITY_AUTO) { node.Log("задача отклонена, отсутствует возможность связаться с вычислителем"); } logger.Debug("нет путей для {0}, задача отклонена", node.GetId()); continue; } tasks.Add(task); logger.Debug("таск пойман"); cntr++; if (cntr >= 100) { cntr = 0; AddTasks(tasks); logger.Debug("порция {0} задач ушла", tasks.Count); tasks.Clear(); } //var task = new PollTask(what, node, arguments, node.GetPaths(), priority); //if (!task.HasPaths()) //{ // if (task.Priority != PollTask.PRIORITY_AUTO) // node.Log("задача отклонена, отсутствует возможность связаться с вычислителем"); // return; //} //tasks.Add(task); //cntr++; //if(cntr>=100) //{ // cntr = 0; // AddTasks(tasks); // tasks.Clear(); //} } AddTasks(tasks); }
public void Update(PollTask newTask) { if (this.Owner != newTask.Owner || this.What != newTask.What) { return; } CreationDate = newTask.CreationDate; Priority = newTask.Priority > Priority ? newTask.Priority : Priority; paths = newTask.paths; LastActivityTime = DateTime.Now;//DateTime.Now.AddSeconds(-SLEEP_TIME_SEC - 1); }
/// <summary> /// проверка на различие тасков /// </summary> public static bool Different(PollTask task1, PollTask task2) { if (task1 == null || task2 == null) { return(true); } if (task1.paths.Count() != task2.paths.Count()) { return(true); } var final1 = task1.paths.Select(p => GetFinalNode(p.LastOrDefault())).ToArray(); var final2 = task2.paths.Select(p => GetFinalNode(p.LastOrDefault())).ToArray(); var except = final1.Except(final2).ToArray(); return(except.Length > 0); }
private PollTask FindDuplicate(PollTask task) { if (!initiators.ContainsKey(task.Owner)) { return(null); } List <PollTask> tasks = null; lock (initiators[task.Owner]) tasks = initiators[task.Owner]; foreach (var t in tasks) { if (t.What == task.What) { return(t); } } return(null); }
public void RemoveTask(PollTask task) { if (task == null) { return; } foreach (var executer in executers.Keys) { List <PollTask> taskscopy = null; lock (executers) { taskscopy = executers[executer]; } if (!taskscopy.Contains(task)) { continue; } lock (executers) { executers[executer].Remove(task); } } var start = task.GetStart(); lock (initiators) { if (start != null && initiators.ContainsKey(start) && initiators[start].Contains(task)) { initiators[start].Remove(task); } } }
public void ToEndQueue(PollTask task) { }
/// <summary> /// добавление задач в очередь и начало опроса /// </summary> /// <param name="tasks"></param> private void AddTasks(IEnumerable <PollTask> tasks) { logger.Debug("добавлено {0} задач", tasks.Count()); var needNotifyNodes = new List <PollNode>(); foreach (var task in tasks) { //фильтр дубликатов var duplicate = FindDuplicate(task); if (duplicate != null) { if (duplicate.Priority < task.Priority) { if (!duplicate.IsLock()) { duplicate.Destroy(); } } else { if (!PollTask.Different(task, duplicate)) { Log(string.Format("задача '{0}' уже находится в очереди", task.What), task.Owner.GetId()); continue; } } } //инициаторы var start = task.GetStart(); if (start == null) { continue; } if (start.BeforeTaskAdd(task)) { //поиск конечных нодов (с них начинается опрос) foreach (var final in task.GetFinals()) { lock (executers) { if (!executers.ContainsKey(final)) { executers.Add(final, new List <PollTask>()); } } if (!executers[final].Contains(task)) { executers[final].Add(task); } needNotifyNodes.Add(final); } Log(string.Format("задача '{0}' добавлена, инициатор: {1}", task.What, task.Priority < PollTask.PRIORITY_USER ? "автоопрос" : "пользователь"), task.Owner.GetId()); lock (initiators) { if (!initiators.ContainsKey(start)) { initiators.Add(start, new List <PollTask>()); } } if (!initiators[start].Contains(task)) { initiators[start].Add(task); } //действия после добавления задачи start.AfterTaskAdd(task); } else { //действие после пропуска задачи start.AfterTaskSkip(task); } } logger.Debug(string.Format("добавлено {0} задач", tasks.Count())); //начало опроса NotifyExecuters(needNotifyNodes.Distinct()); }
private void AddTask(PollTask task) { AddTasks(new PollTask[] { task }); }