"""Celery 应用入口。""" from __future__ import annotations from celery import Celery from celery.schedules import crontab from kombu import Queue from fastapi_admin.config import ( LEAUDIT_PAGE_QUALITY_QUEUE_NORMAL, LEAUDIT_PAGE_QUALITY_QUEUE_URGENT, LEAUDIT_RULE_TENANT_MATERIALIZE_CRON_MINUTES, LEAUDIT_TASK_SOFT_TIME_LIMIT, LEAUDIT_TASK_TIME_LIMIT, LEAUDIT_STUCK_SCAN_CRON_MINUTES, LEAUDIT_WORKER_QUEUE_NORMAL, LEAUDIT_WORKER_QUEUE_URGENT, REDIS_DB, REDIS_HOST, REDIS_PASSWORD, REDIS_PORT, ) def _build_redis_url() -> str: """拼接 Redis broker / backend 连接串。""" auth = f":{REDIS_PASSWORD}@" if REDIS_PASSWORD else "" return f"redis://{auth}{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}" celery_app = Celery( "leaudit_platform", broker=_build_redis_url(), backend=_build_redis_url(), ) celery_app.conf.update( task_default_queue=LEAUDIT_WORKER_QUEUE_NORMAL, imports=( "fastapi_modules.fastapi_leaudit.leaudit_bridge.tasks", "fastapi_modules.fastapi_leaudit.govdoc_bridge.tasks", "fastapi_modules.fastapi_leaudit.page_quality.tasks", ), task_queues=( Queue(LEAUDIT_WORKER_QUEUE_URGENT), Queue(LEAUDIT_WORKER_QUEUE_NORMAL), Queue(LEAUDIT_PAGE_QUALITY_QUEUE_URGENT), Queue(LEAUDIT_PAGE_QUALITY_QUEUE_NORMAL), ), task_track_started=True, task_acks_late=True, worker_prefetch_multiplier=1, broker_connection_retry_on_startup=True, task_soft_time_limit=LEAUDIT_TASK_SOFT_TIME_LIMIT, task_time_limit=LEAUDIT_TASK_TIME_LIMIT, beat_schedule={ "leaudit-scan-stuck-documents": { "task": "leaudit.scan_stuck_documents", "schedule": crontab(minute=f"*/{max(1, int(LEAUDIT_STUCK_SCAN_CRON_MINUTES))}"), "options": {"queue": LEAUDIT_WORKER_QUEUE_NORMAL}, }, "leaudit-materialize-rule-tenants": { "task": "leaudit.materialize_rule_tenants", "schedule": crontab(minute=f"*/{max(1, int(LEAUDIT_RULE_TENANT_MATERIALIZE_CRON_MINUTES))}"), "options": {"queue": LEAUDIT_WORKER_QUEUE_NORMAL}, }, }, ) celery_app.autodiscover_tasks( [ "fastapi_modules.fastapi_leaudit.leaudit_bridge", "fastapi_modules.fastapi_leaudit.govdoc_bridge", "fastapi_modules.fastapi_leaudit.page_quality", ], force=True, ) # 显式导入任务模块,避免 worker 在某些启动方式下漏注册 bridge tasks。 from fastapi_modules.fastapi_leaudit.leaudit_bridge import tasks as _leaudit_bridge_tasks # noqa: F401,E402 from fastapi_modules.fastapi_leaudit.govdoc_bridge import tasks as _govdoc_bridge_tasks # noqa: F401,E402 from fastapi_modules.fastapi_leaudit.page_quality import tasks as _page_quality_tasks # noqa: F401,E402