| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- """需求入队 XXL-JOB Handler —— ODPS 拉取 → 聚合 → 写入 MySQL
- XXL-JOB Admin 配置:
- 执行器: long-articles-agentic-src
- 处理器: demandEnqueue
- 参数: dt=yyyyMMdd (可选,不传则默认前天)
- 超时: 建议 ≥300s(ODPS + PG + MySQL 多段查询)
- """
- import logging
- from datetime import datetime, timedelta
- from src.config.odps import OdpsConfig
- from src.infra.xxl_jobs import xxl_job
- from src.domains.demand_enqueue_task import FetchDemands, EnqueueDemands
- from src.handlers._utils import get_db, parse_dt
- logger = logging.getLogger(__name__)
- def _default_dt() -> str:
- return (datetime.now() - timedelta(days=2)).strftime("%Y%m%d")
- @xxl_job("demandEnqueue")
- async def demand_enqueue(param: str) -> dict:
- dt = parse_dt(param, _default_dt())
- logger.info("demandEnqueue started, dt=%s", dt)
- # 1. ODPS 拉取 → PG 查搜索词
- try:
- pg = get_db().pg_manager("pg")
- fetcher = FetchDemands(OdpsConfig(), pg)
- items = await fetcher.deal(dt)
- except Exception:
- logger.exception("ODPS 拉取失败, dt=%s", dt)
- return {"code": 500, "msg": "ODPS 拉取异常"}
- if not items:
- logger.info("无队列项生成, dt=%s", dt)
- return {"code": 200, "msg": "no items"}
- # 2. MySQL 入队
- try:
- mysql = get_db().mysql_manager("long_articles")
- enqueuer = EnqueueDemands(mysql)
- n = await enqueuer.deal(items)
- except Exception:
- logger.exception("MySQL 入队失败, dt=%s", dt)
- return {"code": 500, "msg": "入队异常"}
- accounts = len(set(it["account"] for it in items))
- logger.info(
- "demandEnqueue done: enqueued %d items (%d accounts) for dt=%s",
- n,
- accounts,
- dt,
- )
- return {"code": 200, "msg": f"enqueued={n}, accounts={accounts}"}
|