Se agregaron estados y update a cada una de las tareas
This commit is contained in:
@@ -18,15 +18,6 @@ async def download_edoc(edoc_request: EdocumentsSchema):
|
||||
edoc_dict = edoc_request.model_dump()
|
||||
# Ejecuta la tarea de Celery de forma asíncrona
|
||||
task = process_edoc_download_request.delay(edoc_dict)
|
||||
# Registrar la tarea en el servicio de seguimiento
|
||||
await register_task(
|
||||
task_id=task.id,
|
||||
message=f"Procesando descarga de E-Document {edoc_dict.get('edoc', {}).get('numero_edocument', 'N/A')}",
|
||||
status="submitted",
|
||||
pedimento_id=edoc_dict.get('pedimento', {}).get('id'),
|
||||
organizacion_id=edoc_dict.get('pedimento', {}).get('organizacion'),
|
||||
servicio=7 # 7 corresponde a "EDocument"
|
||||
)
|
||||
# Devuelve el ID de la tarea
|
||||
return {"task_id": task.id, "status": "submitted"}
|
||||
|
||||
@@ -47,14 +38,4 @@ async def download_edocs_masivo(edoc_request: EdocumentsMasivoSchema):
|
||||
}
|
||||
task = process_edoc_download_request.delay(edoc_dict)
|
||||
task_ids.append(task.id)
|
||||
# Registrar cada tarea en el servicio de seguimiento
|
||||
await register_task(
|
||||
task_id=task.id,
|
||||
message=f"Procesando descarga masiva de E-Document {edoc.get('numero_edocument', 'N/A')}",
|
||||
status="submitted",
|
||||
pedimento_id=edoc_dict.get('pedimento', {}).get('id'),
|
||||
organizacion_id=edoc_dict.get('pedimento', {}).get('organizacion'),
|
||||
servicio=7 # 7 corresponde a "EDocument"
|
||||
)
|
||||
|
||||
return {"task_ids": task_ids, "status": "submitted", "total": len(task_ids)}
|
||||
@@ -1,25 +1,89 @@
|
||||
import asyncio
|
||||
import logging
|
||||
import time
|
||||
from celery_app import celery_app
|
||||
from typing import Dict
|
||||
|
||||
from .services import obtener_edoc
|
||||
import asyncio # Necesario para ejecutar funciones async dentro de Celery
|
||||
from api.api_v2.modules.tasks.services import register_task, update_task
|
||||
|
||||
# Logger para el módulo
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@celery_app.task(bind=True)
|
||||
def process_edoc_download_request(self, edoc_data: dict):
|
||||
def process_edoc_download_request(self, edoc_data: Dict) -> Dict:
|
||||
"""
|
||||
Tarea de Celery para procesar la descarga de un solo documento edoc.
|
||||
"""
|
||||
task_id = self.request.id
|
||||
pedimento_info = edoc_data.get('pedimento', {})
|
||||
pedimento_id = pedimento_info.get('id')
|
||||
organizacion_id = pedimento_info.get('organizacion')
|
||||
pedimento_app = pedimento_info.get('pedimento_app', 'N/A')
|
||||
edoc_info = edoc_data.get('edoc', {})
|
||||
edoc_number = edoc_info.get('numero_edoc', 'N/A')
|
||||
|
||||
try:
|
||||
# Ejecutar la función asíncrona dentro del hilo síncrono de Celery
|
||||
# Registrar el inicio de la tarea
|
||||
loop = asyncio.get_event_loop()
|
||||
logger.info(f"[EDOC] Registrando inicio de tarea {task_id}")
|
||||
loop.run_until_complete(
|
||||
register_task(
|
||||
task_id=task_id,
|
||||
status="submitted",
|
||||
message=f"Iniciando proceso de descarga de E-document {edoc_number} para pedimento {pedimento_app}",
|
||||
pedimento_id=pedimento_id,
|
||||
organizacion_id=organizacion_id,
|
||||
servicio=3 # 3 corresponde a "E-document"
|
||||
)
|
||||
)
|
||||
|
||||
# Esperar un momento breve para asegurar que el registro se complete
|
||||
time.sleep(1)
|
||||
|
||||
# Actualizar estado: procesando
|
||||
logger.info(f"[EDOC] Actualizando estado a processing para tarea {task_id}")
|
||||
loop.run_until_complete(
|
||||
update_task(
|
||||
task_id=task_id,
|
||||
status="processing",
|
||||
message=f"Descargando E-document {edoc_number} para pedimento {pedimento_app}",
|
||||
pedimento_id=pedimento_id,
|
||||
organizacion_id=organizacion_id,
|
||||
servicio=3
|
||||
)
|
||||
)
|
||||
|
||||
# Obtener el E-document
|
||||
result = loop.run_until_complete(obtener_edoc(**edoc_data))
|
||||
|
||||
return {"status": "success", "result": result}
|
||||
except Exception as e:
|
||||
# Manejo de errores
|
||||
self.update_state(
|
||||
state='FAILURE',
|
||||
meta={'exc_type': type(e).__name__, 'exc_message': str(e)}
|
||||
# Actualizar estado: completado
|
||||
loop.run_until_complete(
|
||||
update_task(
|
||||
task_id=task_id,
|
||||
status="completed",
|
||||
message=f"E-document {edoc_number} descargado exitosamente para pedimento {pedimento_app}",
|
||||
pedimento_id=pedimento_id,
|
||||
organizacion_id=organizacion_id,
|
||||
servicio=3
|
||||
)
|
||||
)
|
||||
# Es crucial volver a lanzar la excepción para que Celery la marque como fallida
|
||||
raise e
|
||||
|
||||
return {"status": "success", "result": result}
|
||||
|
||||
except Exception as e:
|
||||
# En caso de error, actualizar estado
|
||||
error_message = f"Error al descargar E-document {edoc_number} para pedimento {pedimento_app}: {str(e)}"
|
||||
logger.error(error_message)
|
||||
loop.run_until_complete(
|
||||
update_task(
|
||||
task_id=task_id,
|
||||
status="failed",
|
||||
message=error_message,
|
||||
pedimento_id=pedimento_id,
|
||||
organizacion_id=organizacion_id,
|
||||
servicio=3
|
||||
)
|
||||
)
|
||||
raise
|
||||
|
||||
|
||||
Reference in New Issue
Block a user