PI_Assync_PLD/Services/PLDService.cs
Adriano Serighelli 751e7da3a6 Código funcional.
Consulta da data máxima de cada banco de dados realizada individualmente.
Dados sendo inseridos conforme a data máxima de cada banco de dados.
Pendente realizar paginação da requisição http.
2025-03-22 15:05:14 -03:00

75 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PI_Assync_PLD.Models;
public class PLDService
{
private readonly HttpClientService _httpClient;
private readonly List<IDataRepository> _repositories;
private readonly SemaphoreSlim _requestLimiter = new SemaphoreSlim(5); // Limite de 5 requisições simultâneas
public PLDService(HttpClientService httpClient, List<IDataRepository> repositories)
{
_httpClient = httpClient;
_repositories = repositories;
}
public async Task SincronizarPLDsAsync()
{
Dictionary<IDataRepository, DateTime> datasIniciais = _repositories
.ToDictionary(repo => repo, repo => repo.ObterDataInicial());
DateTime dataFinal = DateTime.Now.Date.AddDays(1);
DateTime dataInicial = datasIniciais.Values.Min();
// Criar um timer que reseta a cada segundo 00
_ = Task.Run(() => ResetarLimitePorMinuto());
Console.WriteLine($"Buscando dados de {dataInicial} até {dataFinal}...");
string xmlRequest = PrepararXML(dataInicial, dataFinal);
await _requestLimiter.WaitAsync();
string resposta = await _httpClient.EnviarRequisicaoAsync(xmlRequest);
_requestLimiter.Release();
// Criar processador e processar XML
var processor = new PLDProcessor();
var plds = processor.ProcessarXML(resposta);
// Atualiza ambos os bancos apenas se houver novos dados
if (plds.Count > 0)
{
// Para cada repositório, passar a data inicial correta
Parallel.ForEach(datasIniciais, kvp =>
{
var repo = kvp.Key;
var ultimaData = kvp.Value;
repo.SalvarPLDs(plds, ultimaData);
});
Console.WriteLine("PLDs salvos com sucesso.");
}
}
private void ResetarLimitePorMinuto()
{
while (true)
{
DateTime now = DateTime.Now;
int delay = (60 - now.Second) * 1000;
Thread.Sleep(delay);
_requestLimiter.Release(5);
}
}
private string PrepararXML(DateTime inicio, DateTime fim)
{
string xmlTemplate = System.IO.File.ReadAllText(@"X:\Back\PLD Horário\listarPLD.txt");
return xmlTemplate.Replace("DATA_INI", inicio.ToString("yyyy-MM-ddT00:00:00"))
.Replace("DATA_FIM", fim.ToString("yyyy-MM-ddT00:00:00"))
.Replace("PAG_NUM", "1");
}
}