Actualización del 2025-08-04 a las 21:10:33
This commit is contained in:
parent
51d61991fc
commit
b44096b07c
3 changed files with 28 additions and 27 deletions
2
app.py
2
app.py
|
|
@ -643,4 +643,4 @@ if __name__ == "__main__":
|
||||||
if not db_pool:
|
if not db_pool:
|
||||||
app.logger.error("La aplicación no puede arrancar sin una conexión a la base de datos.")
|
app.logger.error("La aplicación no puede arrancar sin una conexión a la base de datos.")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
app.run(host="0.0.0.0", port=8000, debug=True)
|
app.run(host="0.0.0.0", port=8001, debug=True)
|
||||||
|
|
|
||||||
24
scheduler.py
24
scheduler.py
|
|
@ -4,11 +4,12 @@ import time
|
||||||
import logging
|
import logging
|
||||||
import atexit
|
import atexit
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import sys # Added this import
|
import sys
|
||||||
|
|
||||||
from apscheduler.schedulers.background import BackgroundScheduler
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
# Importamos la app (para el contexto) y la función de captura desde nuestro fichero principal
|
# Importamos la app (para el contexto) y la función de captura desde nuestro fichero principal
|
||||||
from app import app, fetch_and_store
|
# --- CORRECCIÓN 1: Se cambió 'fetch_and_store' por 'fetch_and_store_all' ---
|
||||||
|
from app import app, fetch_and_store_all
|
||||||
|
|
||||||
# Es importante configurar el logging también para este proceso
|
# Es importante configurar el logging también para este proceso
|
||||||
logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='[%(asctime)s] %(levelname)s in %(module)s: %(message)s')
|
logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='[%(asctime)s] %(levelname)s in %(module)s: %(message)s')
|
||||||
|
|
@ -16,7 +17,7 @@ logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='[%(asctime)s]
|
||||||
# Creamos el planificador con la zona horaria UTC para evitar ambigüedades
|
# Creamos el planificador con la zona horaria UTC para evitar ambigüedades
|
||||||
scheduler = BackgroundScheduler(daemon=True, timezone="UTC")
|
scheduler = BackgroundScheduler(daemon=True, timezone="UTC")
|
||||||
|
|
||||||
# --- INICIO DE LA MEJORA: Apagado robusto con atexit ---
|
# --- Apagado robusto con atexit ---
|
||||||
def shutdown_scheduler():
|
def shutdown_scheduler():
|
||||||
"""Función para detener el planificador de forma segura al salir."""
|
"""Función para detener el planificador de forma segura al salir."""
|
||||||
if scheduler.running:
|
if scheduler.running:
|
||||||
|
|
@ -25,15 +26,15 @@ def shutdown_scheduler():
|
||||||
|
|
||||||
# Registramos la función de apagado para que se ejecute al terminar el proceso
|
# Registramos la función de apagado para que se ejecute al terminar el proceso
|
||||||
atexit.register(shutdown_scheduler)
|
atexit.register(shutdown_scheduler)
|
||||||
# --- FIN DE LA MEJORA ---
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# Usamos el contexto de la aplicación para asegurar que la tarea tiene acceso a todo lo necesario
|
# Usamos el contexto de la aplicación para asegurar que la tarea tiene acceso a todo lo necesario
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
# Añadimos la tarea para que se ejecute cada 15 minutos
|
# Añadimos la tarea para que se ejecute cada 3 minutos
|
||||||
# La primera ejecución será a los 10 segundos de arrancar el worker
|
# La primera ejecución será a los 10 segundos de arrancar el worker
|
||||||
scheduler.add_job(
|
scheduler.add_job(
|
||||||
fetch_and_store,
|
# --- CORRECCIÓN 2: Se cambió 'fetch_and_store' por 'fetch_and_store_all' ---
|
||||||
|
fetch_and_store_all,
|
||||||
"interval",
|
"interval",
|
||||||
minutes=3,
|
minutes=3,
|
||||||
id="rss_job",
|
id="rss_job",
|
||||||
|
|
@ -43,10 +44,15 @@ if __name__ == '__main__':
|
||||||
# Arrancamos el planificador
|
# Arrancamos el planificador
|
||||||
scheduler.start()
|
scheduler.start()
|
||||||
|
|
||||||
logging.info("Worker del Scheduler iniciado. Tarea programada cada 15 minutos.")
|
logging.info("Worker del Scheduler iniciado. Tarea programada cada 3 minutos.")
|
||||||
logging.info("El proceso se mantendrá en ejecución para permitir que se ejecuten las tareas.")
|
logging.info("El proceso se mantendrá en ejecución para permitir que se ejecuten las tareas.")
|
||||||
|
|
||||||
# Este bucle infinito simplemente mantiene vivo el script del worker.
|
# Este bucle infinito simplemente mantiene vivo el script del worker.
|
||||||
# El apagado ahora es manejado por atexit.
|
# El apagado ahora es manejado por atexit.
|
||||||
while True:
|
try:
|
||||||
time.sleep(60)
|
while True:
|
||||||
|
time.sleep(60)
|
||||||
|
except (KeyboardInterrupt, SystemExit):
|
||||||
|
logging.info("Apagando el worker...")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
29
worker.py
29
worker.py
|
|
@ -1,18 +1,13 @@
|
||||||
import sys
|
import sys
|
||||||
import logging # <--- ¡LA LÍNEA QUE FALTABA!
|
import os
|
||||||
from app import fetch_and_store_all, app
|
import logging
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
# Añadimos un logger para ver la salida en el journal de systemd
|
try:
|
||||||
handler = logging.StreamHandler(sys.stdout)
|
from app import app, fetch_and_store
|
||||||
handler.setLevel(logging.INFO)
|
except ImportError as e:
|
||||||
handler.setFormatter(logging.Formatter('[%(asctime)s] %(levelname)s in %(module)s: %(message)s'))
|
logging.basicConfig()
|
||||||
app.logger.addHandler(handler)
|
logging.critical(f"No se pudo importar la aplicación Flask. Error: {e}")
|
||||||
|
sys.exit(1)
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
app.logger.info("Iniciando tarea de recolección desde worker.py...")
|
with app.app_context():
|
||||||
try:
|
fetch_and_store()
|
||||||
# Llamamos a la función con el nombre correcto
|
|
||||||
fetch_and_store_all()
|
|
||||||
app.logger.info("Tarea de recolección finalizada exitosamente.")
|
|
||||||
except Exception as e:
|
|
||||||
app.logger.error(f"La tarea de recolección falló con una excepción: {e}", exc_info=True)
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue