public async Task <Fundamento> ProcessarAsync(Papel papel) { try { // Busca o HtmlDocument do papel var url = string.Format(BaseUrl, papel.Nome.Trim().ToUpper()); var htmlDoc = await HtmlHelper.GetHtmlDocumentAsync(url); // Busca os dados da página e monta o fundamento var fundamento = new Fundamento { PapelId = papel.Id, LPA = ParseDoubleValue(htmlDoc, LPAPath), ROE = ParseDoubleValue(htmlDoc, ROEPath), VPA = ParseDoubleValue(htmlDoc, VPAPath), ROIC = ParseDoubleValue(htmlDoc, ROICPath), ValorMercado = ParseDecimalValue(htmlDoc, ValorMercadoPath) }; _logger.LogInformation($"Processado com sucesso o papel {papel.Nome}."); // Retorna o fundamento processado return(fundamento); } catch (Exception e) { _logger.LogError(e.Message); throw; } }
public async void ReplicarFundamento(Fundamento fundamento) { if (fundamento == null) { throw new ArgumentNullException(nameof(fundamento)); } await ReplicarFundamentoAsync(fundamento); }
private async Task ReplicarFundamentoAsync(Fundamento fundamento) { // Busca os nodos de replicação ativos var nodosReplicacao = await _unitOfWork.Replicacoes.Find(x => x.Ativo).ToListAsync(); // Replica o fundamento em cada um dos nodos enviando uma requisição HTTP foreach (var nodo in nodosReplicacao) { var fundamentoDto = _mapper.Map <FundamentoDto>(fundamento); await ReplicarFundamentoAsync(nodo.Url, fundamentoDto); } }
private async Task ReplicarFundamentoAsync(Fundamento fundamento, SemaphoreSlim semaforo, int intervalo) { // try // { // // Processa o fundamento e adiciona na lista // var fundamento = await ProcessarAsync(papel); // fundamentos.Add(fundamento); // // // Aguarda cinco segundos entre processamentos para evitar bloqueio de IP // _logger.LogInformation($"Delay de {intervaloProcessamento} segundos após processar o papel {papel.Id}..."); // await Task.Delay(TimeSpan.FromSeconds(intervaloProcessamento)); // } // catch (Exception e) // { // _logger.LogError($"Falha em processar o papel {papel.Nome}:{e.Message}"); // } // finally // { // semaforo.Release(); // _logger.LogDebug($"Papel {papel.Nome} saiu do semáforo."); // } try { await ReplicarFundamentoAsync(fundamento); // Aguarda X segundos entre processamentos _logger.LogInformation($"Delay de {intervalo} segundos após processar o fundamento do papel de id {fundamento.PapelId}..."); await Task.Delay(TimeSpan.FromSeconds(intervalo)); } catch (Exception e) { _logger.LogError(e.Message); } finally { semaforo.Release(); // _logger.LogDebug($"Papel {papel.Nome} saiu do semáforo."); } }