Log de informações atualizadas e inseridas.

This commit is contained in:
Adriano Serighelli 2025-09-30 14:24:57 -03:00
parent d512a8afc4
commit 243d1551d1

View File

@ -51,9 +51,9 @@ internal class Plat_integ
{ {
using var cmd = new OleDbCommand(query, connection); using var cmd = new OleDbCommand(query, connection);
connection.Open(); connection.Open();
using var reader = cmd.ExecuteReader(); using var reader = cmd.ExecuteReader();
while (reader.Read()) while (reader.Read())
{ {
lista.Add( lista.Add(
new perfil( new perfil(
@ -72,6 +72,8 @@ internal class Plat_integ
var limiter = new RateLimiter(400, TimeSpan.FromMinutes(1)); var limiter = new RateLimiter(400, TimeSpan.FromMinutes(1));
var errosPersistentes = new ConcurrentBag<string>(); var errosPersistentes = new ConcurrentBag<string>();
var atualizados = new ConcurrentBag<string>();
var inseridos = new ConcurrentBag<string>();
await using var dataSource = NpgsqlDataSource.Create(PG_CONN_STRING_PROD); await using var dataSource = NpgsqlDataSource.Create(PG_CONN_STRING_PROD);
@ -125,28 +127,28 @@ internal class Plat_integ
foreach (DateTime dia in datas) foreach (DateTime dia in datas)
{ {
int tentativas = 0; int tentativas = 0;
bool sucesso = false; bool sucesso = false;
while (tentativas < 5 && !sucesso) while (tentativas < 5 && !sucesso)
{ {
if (perfil._Data_de_Migracao > dia) if (perfil._Data_de_Migracao > dia)
{ {
Console.WriteLine($"Pular {perfil._Codigo_SCDE} - {dia.ToShortDateString()} (antes da migração)"); Console.WriteLine($"Pular {perfil._Codigo_SCDE} - {dia.ToShortDateString()} (antes da migração)");
errosPersistentes.Add($"{perfil._Cod_5min};{perfil._Codigo_SCDE};Fora da data de migração {perfil._Data_de_Migracao} x {dia}"); errosPersistentes.Add($"{perfil._Cod_5min};{perfil._Codigo_SCDE};Fora da data de migração {perfil._Data_de_Migracao} x {dia}");
break; // não tentar antes da data de migração break; // não tentar antes da data de migração
} }
try try
{ {
string payload = Xml_requisicao(dia, perfil._Cod_5min, perfil._Codigo_SCDE, 1); string payload = Xml_requisicao(dia, perfil._Cod_5min, perfil._Codigo_SCDE, 1);
var conteudo = new StringContent(payload, Encoding.UTF8, "application/xml"); var conteudo = new StringContent(payload, Encoding.UTF8, "application/xml");
await limiter.WaitAsync(ct); await limiter.WaitAsync(ct);
using var response = await client.PostAsync(endpoint, conteudo, ct); using var response = await client.PostAsync(endpoint, conteudo, ct);
string resposta = await response.Content.ReadAsStringAsync(); string resposta = await response.Content.ReadAsStringAsync();
if ((int)response.StatusCode >= 400) if ((int)response.StatusCode >= 400)
{ {
try try
{ {
VerificarRespostaSOAP(resposta); VerificarRespostaSOAP(resposta);
@ -155,12 +157,12 @@ internal class Plat_integ
{ {
if (ex.ErrorCode == "2003") // limite de requisições if (ex.ErrorCode == "2003") // limite de requisições
{ {
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
var delay = 60000 - (now.Second * 1000 + now.Millisecond); var delay = 60000 - (now.Second * 1000 + now.Millisecond);
Console.WriteLine($"!! Limite de requisições atingido. Aguardando até {DateTime.Now.AddMilliseconds(delay)}"); Console.WriteLine($"!! Limite de requisições atingido. Aguardando até {DateTime.Now.AddMilliseconds(delay)}");
await Task.Delay(delay, ct); // tentar de novo sem contar como falha await Task.Delay(delay, ct); // tentar de novo sem contar como falha
continue; continue;
} }
if (ex.ErrorCode == "4001") // Dados não encontrados if (ex.ErrorCode == "4001") // Dados não encontrados
{ {
errosPersistentes.Add($"{perfil._Cod_5min};{perfil._Codigo_SCDE};SOAP Fault: {ex.ErrorCode};{ex.ErrorMessage.Replace("\n", "-n-")}"); errosPersistentes.Add($"{perfil._Cod_5min};{perfil._Codigo_SCDE};SOAP Fault: {ex.ErrorCode};{ex.ErrorMessage.Replace("\n", "-n-")}");
@ -180,24 +182,24 @@ internal class Plat_integ
await ProcessarXMLAsync(resposta, dataSource, dia, perfil._Cod_5min, perfil._Codigo_SCDE, existentes, limiter, ct, 1); await ProcessarXMLAsync(resposta, dataSource, dia, perfil._Cod_5min, perfil._Codigo_SCDE, existentes, limiter, ct, 1);
sucesso = true; sucesso = true;
}
catch (Exception ex)
{
tentativas++;
if (tentativas >= 5)
{
errosPersistentes.Add($"{perfil._Cod_5min};{perfil._Codigo_SCDE};Erro;{ex.Message.Replace("\n", "-n-")}");
} }
else catch (Exception ex)
{ {
int backoff = (int)Math.Pow(2.4, tentativas) * 1000; // exponencial tentativas++;
Console.WriteLine($"Erro na requisição ({ex.Message}), tentativa {tentativas}. Aguardando {backoff / 1000}s..."); if (tentativas >= 5)
{
errosPersistentes.Add($"{perfil._Cod_5min};{perfil._Codigo_SCDE};Erro;{ex.Message.Replace("\n", "-n-")}");
}
else
{
int backoff = (int)Math.Pow(2.4, tentativas) * 1000; // exponencial
Console.WriteLine($"Erro na requisição ({ex.Message}), tentativa {tentativas}. Aguardando {backoff / 1000}s...");
await Task.Delay(backoff); await Task.Delay(backoff);
}
} }
} }
} }
}
Console.WriteLine($"{DateTime.Now}: Finalizado ponto {perfil._Codigo_SCDE}"); Console.WriteLine($"{DateTime.Now}: Finalizado ponto {perfil._Codigo_SCDE}");
} }
catch (Exception ex) catch (Exception ex)
@ -350,14 +352,14 @@ internal class Plat_integ
foreach (var m in alterados) foreach (var m in alterados)
{ {
var cmd = new NpgsqlBatchCommand(@" var cmd = new NpgsqlBatchCommand(@"
UPDATE med_5min UPDATE med_5min
SET origem = @origem, SET origem = @origem,
ativa_consumo = @ativa_consumo, ativa_consumo = @ativa_consumo,
ativa_geracao = @ativa_geracao, ativa_geracao = @ativa_geracao,
reativa_consumo = @reativa_consumo, reativa_consumo = @reativa_consumo,
reativa_geracao = @reativa_geracao reativa_geracao = @reativa_geracao
WHERE ponto = @ponto WHERE ponto = @ponto
AND dia_num = @dia_num AND dia_num = @dia_num
AND minuto = @minuto;"); AND minuto = @minuto;");
// Adiciona os parâmetros de forma segura // Adiciona os parâmetros de forma segura
@ -382,7 +384,7 @@ internal class Plat_integ
return; return;
} }
public class SoapFaultException : Exception public class SoapFaultException : Exception
{ {
public string FaultCode { get; } public string FaultCode { get; }
public string FaultString { get; } public string FaultString { get; }
public string ErrorCode { get; } public string ErrorCode { get; }
@ -406,7 +408,7 @@ internal class Plat_integ
var fault = doc.Descendants(env + "Fault").FirstOrDefault(); var fault = doc.Descendants(env + "Fault").FirstOrDefault();
if (fault != null) if (fault != null)
{ {
string faultCode = fault.Element("faultcode")?.Value ?? ""; string faultCode = fault.Element("faultcode")?.Value ?? "";
string faultString = fault.Element("faultstring")?.Value ?? ""; string faultString = fault.Element("faultstring")?.Value ?? "";
@ -416,7 +418,7 @@ internal class Plat_integ
throw new SoapFaultException(faultCode, faultString, errorCode, message); throw new SoapFaultException(faultCode, faultString, errorCode, message);
} }
} }
public class RateLimiter public class RateLimiter
{ {
@ -427,7 +429,7 @@ internal class Plat_integ
private readonly object _lock = new(); private readonly object _lock = new();
public RateLimiter(int maxRequests, TimeSpan interval) public RateLimiter(int maxRequests, TimeSpan interval)
{ {
_maxRequests = maxRequests; _maxRequests = maxRequests;
_interval = interval; _interval = interval;
var now = DateTime.Now; var now = DateTime.Now;
@ -458,9 +460,9 @@ internal class Plat_integ
// já bateu o limite → espera até reset // já bateu o limite → espera até reset
await Task.Delay(200, ct); // aguarda 200ms e tenta de novo await Task.Delay(200, ct); // aguarda 200ms e tenta de novo
} }
}
}
} }
}
}
public class perfil public class perfil
{ {