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.
75 lines
2.5 KiB
C#
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");
|
|
}
|
|
}
|