/// <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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        /// <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 });
 }