Fix TimeOut Api
This commit is contained in:
@@ -34,15 +34,12 @@ public class Worker : BackgroundService
|
||||
{
|
||||
_logger.LogInformation("Elecciones Worker iniciado a las: {time}", DateTimeOffset.Now);
|
||||
|
||||
// 1. SINCRONIZACIÓN INICIAL: Se ejecuta una vez al iniciar el worker para
|
||||
// asegurar que la base de datos local tenga todos los catálogos maestros.
|
||||
await SincronizarCatalogosMaestrosAsync(stoppingToken);
|
||||
|
||||
_logger.LogInformation("-------------------------------------------------");
|
||||
_logger.LogInformation("Iniciando sondeo periódico de resultados...");
|
||||
_logger.LogInformation("-------------------------------------------------");
|
||||
|
||||
// 2. BUCLE DE SONDEO: Se ejecuta continuamente hasta que se detenga la aplicación.
|
||||
while (!stoppingToken.IsCancellationRequested)
|
||||
{
|
||||
var authToken = await _apiService.GetAuthTokenAsync();
|
||||
@@ -53,13 +50,23 @@ public class Worker : BackgroundService
|
||||
continue;
|
||||
}
|
||||
|
||||
await Task.WhenAll(
|
||||
SondearResultadosMunicipalesAsync(authToken, stoppingToken),
|
||||
SondearProyeccionBancasAsync(authToken, stoppingToken),
|
||||
SondearNuevosTelegramasAsync(authToken, stoppingToken),
|
||||
SondearResumenProvincialAsync(authToken, stoppingToken),
|
||||
SondearEstadoRecuentoGeneralAsync(authToken, stoppingToken)
|
||||
);
|
||||
// --- CAMBIO CLAVE: DE PARALELO A SECUENCIAL ---
|
||||
// Se elimina Task.WhenAll y se ejecutan las tareas una después de la otra.
|
||||
// Esto previene los errores de Gateway Timeout (504).
|
||||
_logger.LogInformation("--- Iniciando sondeo de Resultados Municipales ---");
|
||||
await SondearResultadosMunicipalesAsync(authToken, stoppingToken);
|
||||
|
||||
_logger.LogInformation("--- Iniciando sondeo de Proyección de Bancas ---");
|
||||
await SondearProyeccionBancasAsync(authToken, stoppingToken);
|
||||
|
||||
_logger.LogInformation("--- Iniciando sondeo de Nuevos Telegramas ---");
|
||||
await SondearNuevosTelegramasAsync(authToken, stoppingToken);
|
||||
|
||||
_logger.LogInformation("--- Iniciando sondeo de Resumen Provincial ---");
|
||||
await SondearResumenProvincialAsync(authToken, stoppingToken);
|
||||
|
||||
_logger.LogInformation("--- Iniciando sondeo de Estado de Recuento General ---");
|
||||
await SondearEstadoRecuentoGeneralAsync(authToken, stoppingToken);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -117,13 +124,18 @@ public class Worker : BackgroundService
|
||||
|
||||
// --- 2. SINCRONIZAR ÁMBITOS Y AGRUPACIONES POR CADA CATEGORÍA ---
|
||||
|
||||
// CORRECCIÓN: La siguiente línea faltaba por completo, causando el error CS0103.
|
||||
// Carga todos los ámbitos existentes en un diccionario para una verificación rápida.
|
||||
var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync(
|
||||
a => (a.DistritoId, a.SeccionId, a.MunicipioId, a.CircuitoId, a.EstablecimientoId),
|
||||
a => a,
|
||||
stoppingToken
|
||||
);
|
||||
var ambitosEnDb = new Dictionary<string, AmbitoGeografico>();
|
||||
var todosLosAmbitos = await dbContext.AmbitosGeograficos.ToListAsync(stoppingToken);
|
||||
|
||||
foreach (var ambito in todosLosAmbitos)
|
||||
{
|
||||
// Creamos una clave única que SIEMPRE funciona, incluso con nulos.
|
||||
string clave = $"{ambito.NivelId}|{ambito.DistritoId}|{ambito.SeccionProvincialId}|{ambito.SeccionId}|{ambito.MunicipioId}|{ambito.CircuitoId}|{ambito.EstablecimientoId}|{ambito.MesaId}";
|
||||
if (!ambitosEnDb.ContainsKey(clave))
|
||||
{
|
||||
ambitosEnDb.Add(clave, ambito);
|
||||
}
|
||||
}
|
||||
|
||||
var agrupacionesEnDb = await dbContext.AgrupacionesPoliticas.ToDictionaryAsync(a => a.Id, a => a, stoppingToken);
|
||||
|
||||
@@ -135,18 +147,11 @@ public class Worker : BackgroundService
|
||||
var catalogoDto = await _apiService.GetCatalogoAmbitosAsync(authToken, categoria.CategoriaId);
|
||||
if (catalogoDto != null)
|
||||
{
|
||||
// SINCRONIZAR ÁMBITOS
|
||||
foreach (var ambitoDto in catalogoDto.Ambitos)
|
||||
{
|
||||
var claveUnica = (
|
||||
ambitoDto.CodigoAmbitos.DistritoId,
|
||||
ambitoDto.CodigoAmbitos.SeccionId,
|
||||
ambitoDto.CodigoAmbitos.MunicipioId,
|
||||
ambitoDto.CodigoAmbitos.CircuitoId,
|
||||
ambitoDto.CodigoAmbitos.EstablecimientoId
|
||||
);
|
||||
// Volvemos a generar la misma clave única para la comparación
|
||||
string claveUnica = $"{ambitoDto.NivelId}|{ambitoDto.CodigoAmbitos.DistritoId}|{ambitoDto.CodigoAmbitos.SeccionProvincialId}|{ambitoDto.CodigoAmbitos.SeccionId}|{ambitoDto.CodigoAmbitos.MunicipioId}|{ambitoDto.CodigoAmbitos.CircuitoId}|{ambitoDto.CodigoAmbitos.EstablecimientoId}|{ambitoDto.CodigoAmbitos.MesaId}";
|
||||
|
||||
// Aquí se usaba 'ambitosEnDb' sin haberlo declarado. Ahora funciona.
|
||||
if (!ambitosEnDb.ContainsKey(claveUnica))
|
||||
{
|
||||
var nuevoAmbito = new AmbitoGeografico
|
||||
@@ -154,14 +159,14 @@ public class Worker : BackgroundService
|
||||
Nombre = ambitoDto.Nombre,
|
||||
NivelId = ambitoDto.NivelId,
|
||||
DistritoId = ambitoDto.CodigoAmbitos.DistritoId,
|
||||
SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId,
|
||||
SeccionId = ambitoDto.CodigoAmbitos.SeccionId,
|
||||
MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId,
|
||||
CircuitoId = ambitoDto.CodigoAmbitos.CircuitoId,
|
||||
EstablecimientoId = ambitoDto.CodigoAmbitos.EstablecimientoId,
|
||||
SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId
|
||||
MesaId = ambitoDto.CodigoAmbitos.MesaId,
|
||||
};
|
||||
dbContext.AmbitosGeograficos.Add(nuevoAmbito);
|
||||
// Se añade al diccionario en memoria para evitar duplicados en el mismo ciclo.
|
||||
ambitosEnDb.Add(claveUnica, nuevoAmbito);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user