Example #1
0
        /// <summary>
        /// Méthode de réception des objets de transfert de données permettant d'initialiser un TaskExecutor avec le nom de la méthode reçue dans l'objet de transfert
        /// </summary>
        /// <param name="input">Objet de transfert contenant la méthode</param>
        /// <param name="node">Noeud emetteur</param>
        public override void ProcessInput(DataInput input, Node node)
        {
            Logger.Write($"Traitement en cours pour : {input.Method}.");
            TaskExecutor executor = WorkerFactory.GetWorker(input.Method);

            if (!input.Method.Equals(IdentMethod) && !input.Method.Equals(GetCpuMethod))
            {
                // Creation d'une nouvelle task
                Tasks.TryAdd(input.NodeTaskId, new Task(input.NodeTaskId, NodeState.Wait));
                Results.TryAdd(input.NodeTaskId, new ConcurrentBag <object>());
            }
            object res = executor.DoWork(input);

            if (res != null)
            {
                DataInput resp = new DataInput()
                {
                    ClientGuid = input.ClientGuid,
                    NodeGuid   = NodeGuid,
                    TaskId     = input.TaskId,
                    NodeTaskId = input.NodeTaskId,
                    Method     = input.Method,
                    Data       = res,
                    MsgType    = MessageType.Response
                };
                SendData(node, resp);
            }
        }
Example #2
0
        /// <summary>
        /// Méthode d'écoute de fin d'exécution des BackgroundWorkers
        /// </summary>
        /// <param name="sender">BackgroundWorker emetteur</param>
        /// <param name="e">résultat de fin de traitement</param>
        protected void WorkerEndProcess(object sender, RunWorkerCompletedEventArgs e)
        {
            // Manage if e.Error != null
            Tuple <int, DataInput, int> data = (Tuple <int, DataInput, int>)e.Result;
            DataInput resp = data.Item2;

            UpdateWorkerTaskStatus(data.Item1, data.Item2.NodeTaskId, NodeState.Finish);
            UpdateResult(resp.Data, data.Item2.NodeTaskId, data.Item1);
            if (TaskIsCompleted(resp.NodeTaskId))
            {
                Logger.Write($"Traitement terminé pour {data.Item2.Method}.");
                Logger.Write(@"Résultat envoyé à l'orchestrateur.");
                IReducer reducer = WorkerFactory.GetWorker(resp.Method).Reducer;
                object   result  = reducer.Reduce(GetResultFromTaskId(resp.NodeTaskId));
                resp.Data = result;
                SendData(Orch, resp);
            }
            else
            {
                double    progression = GetWorkersProgression(data.Item2.NodeTaskId, data.Item3);
                DataInput status      = new DataInput()
                {
                    ClientGuid = data.Item2.ClientGuid,
                    NodeGuid   = NodeGuid,
                    MsgType    = MessageType.Call,
                    Method     = TaskStatusMethod,
                    TaskId     = data.Item2.TaskId,
                    NodeTaskId = data.Item2.NodeTaskId,
                    Data       = new Tuple <NodeState, object>(NodeState.Work, progression)
                };
                SendData(Orch, status);
            }
        }
Example #3
0
        /// <summary>
        /// Méthode de démarrage du traitement métier par l'attribution de la méthode demandé à un TaskExecutor
        /// </summary>
        /// <param name="input">Objet de transfert contenant la méthode et la donnée</param>
        /// <returns></returns>
        private object DnaQuantStarter(DataInput input)
        {
            Logger.Write(@"Démarrage de la fonction DNAQuantProcess.");
            //Thread.Sleep(1000 * input.NodeTaskId);
            TaskExecutor executor            = WorkerFactory.GetWorker(input.Method);
            List <Tuple <int, char[]> > list = (List <Tuple <int, char[]> >)executor.Mapper.Map(input.Data, Environment.ProcessorCount);

            foreach (Tuple <int, char[]> t in list)
            {
                LaunchBgForWork(DnaQuantProcess, PrepareData(input, t), list.Count);
            }
            return(null);
        }
Example #4
0
        static void Main(string[] args)
        {
            var parser = new ArgParser();

            var parameters = parser.GetParameters(_args);

            var      factory = new WorkerFactory();
            IProblem worker  = (IProblem)factory.GetWorker(parameters.Problem);

            worker.Solve(parameters.Input);

            Console.WriteLine("Press any key to quit");
            Console.ReadKey();
        }
Example #5
0
        /// <summary>
        /// Méthode chargée de transmettre un traitement à un mapper par le biais d'un TaskExecutor
        /// </summary>
        /// <param name="input">Objet de transfert contenant la donnée</param>
        private void LazyNodeTranfert(DataInput input)
        {
            int newTaskId = LastTaskId;

            CreateClientTask(input, newTaskId);
            ConcurrentBag <object> emptyResult = new ConcurrentBag <object>();

            Results.TryAdd(newTaskId, emptyResult);
            TaskExecutor executor = WorkerFactory.GetWorker(input.Method);
            // On récupère le résultat du map
            IMapper mapper = executor.Mapper;

            LaunchMapping(mapper, input, newTaskId);
        }
Example #6
0
        /// <summary>
        /// Méthode de gestion des traitements envoyés et reçus avec MapReduce
        /// </summary>
        /// <param name="input">Objet de transfert</param>
        /// <returns></returns>
        protected object ProcessMapReduce(DataInput input)
        {
            Logger.Write($"Traitement en cours pour la méthode {input.Method}");
            TaskExecutor executor = WorkerFactory.GetWorker(input.Method);

            switch (input.MsgType)
            {
            case MessageType.Call:
                LazyNodeTranfert(input);
                break;

            case MessageType.Response:
                PrepareReduce(input, executor);
                break;
            }
            return(null);
        }
Example #7
0
        /// <summary>
        /// Méthode d'exécution d'un TaskExecutor avec la méthode reçue dans l'objet de transfert
        /// </summary>
        /// <param name="input">Objet de transfert contenant la méthode</param>
        /// <param name="node">Noeud emetteur</param>
        public override void ProcessInput(DataInput input, Node node)
        {
            TaskExecutor executor = WorkerFactory.GetWorker(input.Method);
            object       res      = executor.DoWork(input);

            if (res == null)
            {
                return;
            }
            DataInput resp = new DataInput()
            {
                ClientGuid = input.ClientGuid,
                NodeGuid   = NodeGuid,
                TaskId     = input.TaskId,
                Method     = input.Method,
                Data       = res,
                MsgType    = MessageType.Response
            };

            SendData(node, resp);
        }
Example #8
0
        /// <summary>
        /// Gère la reception des demandes contenues dans l'objet de transfert depuis un noeud
        /// </summary>
        /// <param name="input">objet de transfert</param>
        /// <param name="node">noeud emetteur</param>
        public override void ProcessInput(DataInput input, Node node)
        {
            TaskExecutor executor = WorkerFactory.GetWorker(input.Method);

            if (MethodIsNotInfra(input.Method) && input.MsgType == MessageType.Response)
            {
                ViewModelLocator.VmlMonitorUcStatic.RefreshStateFromTaskResult(input);
            }
            object res = executor.DoWork(input);

            if (res != null)
            {
                DataInput resp = new DataInput()
                {
                    ClientGuid = input.ClientGuid,
                    NodeGuid   = NodeGuid,
                    TaskId     = input.TaskId,
                    Method     = input.Method,
                    Data       = res,
                    MsgType    = MessageType.Response
                };
                SendData(node, resp);
            }
        }