Exemplo n.º 1
0
        private async Task TaskWork(CashTask cashTask, DateTime?dateTime)
        {
            List <string> guids = await GetGuidsAsync(dateTime);

            List <TextTaskResult> localTasksResults = new List <TextTaskResult>();

            //так лучше не делать. Как переписать?
            using (var scope = _scopeFactory.CreateScope())
            {
                TaskDbContext _context = scope.ServiceProvider.GetRequiredService <TaskDbContext>();

                var searchWords = _context.SearchWords.Where(x => x.IdTask == cashTask.Id).ToList();

                var unrealizedGuids = guids.Select(x => Guid.Parse(x));
                foreach (var guid in unrealizedGuids)
                {
                    try
                    {
                        //запрос в другой микросервис на работы по guid
                        FindService.Entities.WordMatches findResult = await _findClient.GetById(guid, cashTask.SearchWords);

                        string[] countWord = findResult.Quantity.Split(' ');

                        //записываем результат для этого guid в в локальную переменную
                        for (int i = 0; i < cashTask.SearchWords.Count; i++)
                        {
                            var IdWord = searchWords.First(x => x.Word == cashTask.SearchWords[i]).Id;

                            localTasksResults.Add(new TextTaskResult()
                            {
                                Id     = new Guid(),
                                IdTask = cashTask.Id,
                                IdText = guid,
                                IdWord = IdWord,
                                Count  = Int32.Parse(countWord[i])
                            });
                        }
                    }
                    catch (ApiException ex)
                    {
                        _logger.LogInformation($"TaskWorker|ERROR| Service FindService Ошибка опроса {ex.RequestMessage}. _findClient.GetById(new Guid({guid}), {cashTask.SearchWords}); |{DateTimeOffset.Now}");
                    }
                }
                if (localTasksResults.Count > 0)
                {
                    await _context.TextTaskResult.AddRangeAsync(localTasksResults);

                    await _context.SaveChangesAsync();
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Доделываем работу (при ошибках, и нестабильной работы)
        /// </summary>
        private async Task FinishUnrealizedWork()
        {
            List <string> guids = await GetGuidsAsync(null);

            List <TextTaskResult> tasksResults;

            //получаем из таблицы TextTaskResult выполненые данные по задачам
            //так лучше не делать. Как переписать?
            using (var scope = _scopeFactory.CreateScope())
            {
                TaskDbContext _context = scope.ServiceProvider.GetRequiredService <TaskDbContext>();
                tasksResults = _context.TextTaskResult.ToList();
                //.Where(x => получить список только тех iD task,которые в кеше

                // слова с idTask'ом
                var searchWords = _context.SearchWords.ToList();
                //.Where .... только для idTask которые в работе

                List <TextTaskResult> unrealizedTasksResults = new List <TextTaskResult>();

                foreach (var task in _cacheTaskService.cashTaskGetAll())
                {
                    // не приближаем будущее, оно и так настанет
                    // не учитываем задачи из будушего
                    if (task.StartTime.ToLocalTime() > DateTime.Now)
                    {
                        task.State = TaskFlags.New;
                        continue;
                    }

                    //получаем список текстов по которым задача отработала
                    var texts = tasksResults.Where(x => x.IdTask == task.Id).Select(x => x.IdText);

                    //получаем список неотработанных guids для текущей задачи, по ним отрабатываем, и записываем в локальную переменную, а далее в базу
                    var unrealizedGuids = guids.Select(x => Guid.Parse(x)).Except(texts);
                    foreach (var item in unrealizedGuids)
                    {
                        try
                        {
                            //запрос в другой микросервис на работы по guid
                            FindService.Entities.WordMatches findResult = await _findClient.GetById(item, task.SearchWords);

                            string[] countWord = findResult.Quantity.Split(' ');

                            //записываем результат для этого guid в локальную переменную
                            for (int i = 0; i < task.SearchWords.Count; i++)
                            {
                                unrealizedTasksResults.Add(new TextTaskResult()
                                {
                                    Id     = new Guid(),
                                    IdTask = task.Id,
                                    IdText = item,
                                    IdWord = searchWords.First(x => x.IdTask == task.Id && x.Word == task.SearchWords[i]).Id,
                                    Count  = Int32.Parse(countWord[i])
                                });
                            }
                        }
                        catch (ApiException ex)
                        {
                            _logger.LogInformation($"TaskWorker|ERROR| Service FindService Ошибка опроса {ex.RequestMessage}. _findClient.GetById(new Guid({item}), {task.SearchWords}); |{DateTimeOffset.Now}");
                        }
                    }
                }

                if (unrealizedTasksResults.Count > 0)
                {
                    await _context.TextTaskResult.AddRangeAsync(unrealizedTasksResults);

                    await _context.SaveChangesAsync();
                }
            }
            //end FinishUnrealizedWork
        }