demand_enqueue.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. """需求入队 XXL-JOB Handler —— ODPS 拉取 → 聚合 → 写入 MySQL
  2. XXL-JOB Admin 配置:
  3. 执行器: long-articles-agentic-src
  4. 处理器: demandEnqueue
  5. 参数: dt=yyyyMMdd (可选,不传则默认前天)
  6. 超时: 建议 ≥300s(ODPS + PG + MySQL 多段查询)
  7. """
  8. import logging
  9. from datetime import datetime, timedelta
  10. from src.config.odps import OdpsConfig
  11. from src.infra.xxl_jobs import xxl_job
  12. from src.domains.demand_enqueue_task import FetchDemands, EnqueueDemands
  13. from src.handlers._utils import get_db, parse_dt
  14. logger = logging.getLogger(__name__)
  15. def _default_dt() -> str:
  16. return (datetime.now() - timedelta(days=2)).strftime("%Y%m%d")
  17. @xxl_job("demandEnqueue")
  18. async def demand_enqueue(param: str) -> dict:
  19. dt = parse_dt(param, _default_dt())
  20. logger.info("demandEnqueue started, dt=%s", dt)
  21. # 1. ODPS 拉取 → PG 查搜索词
  22. try:
  23. pg = get_db().pg_manager("pg")
  24. fetcher = FetchDemands(OdpsConfig(), pg)
  25. items = await fetcher.deal(dt)
  26. except Exception:
  27. logger.exception("ODPS 拉取失败, dt=%s", dt)
  28. return {"code": 500, "msg": "ODPS 拉取异常"}
  29. if not items:
  30. logger.info("无队列项生成, dt=%s", dt)
  31. return {"code": 200, "msg": "no items"}
  32. # 2. MySQL 入队
  33. try:
  34. mysql = get_db().mysql_manager("long_articles")
  35. enqueuer = EnqueueDemands(mysql)
  36. n = await enqueuer.deal(items)
  37. except Exception:
  38. logger.exception("MySQL 入队失败, dt=%s", dt)
  39. return {"code": 500, "msg": "入队异常"}
  40. accounts = len(set(it["account"] for it in items))
  41. logger.info(
  42. "demandEnqueue done: enqueued %d items (%d accounts) for dt=%s",
  43. n,
  44. accounts,
  45. dt,
  46. )
  47. return {"code": 200, "msg": f"enqueued={n}, accounts={accounts}"}