feat(gateway): 下单任务支持 callback_url 终结类事件异步通知
- POST /api/orders 新增可选 callback_url(仅 http/https,其余 422) - 仅终结类事件各通知一次:terminal report 推入终态(succeeded/failed/ needs_human)、租约过期被 sweep 置 stale;中间态与终结后的监控上报不通知 - 幂等重发不更新既有任务的回调地址;投递 best-effort 单次尝试,失败只记日志 - CallbackNotifier 发后不管(create_task + 在途任务强引用),关停等在途发完; 生产路径按回调地址逐次构造客户端,满足统一出站代理策略(test_proxy.py) - tasks 表加 callback_url 列,GatewayDB.start() 内置迁移兼容既有库 - 新增 RAKUTEN_CALLBACK_TIMEOUT_SECONDS(默认 10);文档补 §4.8; openapi.json 重新导出(gitignore 未跟踪);新增 17 条测试,全量 492 通过
This commit is contained in:
@@ -53,12 +53,19 @@ async def submit_order(
|
||||
幂等:同一个 task_id 重复提交不新建任务,返回既有任务且 created=false——
|
||||
上游重发不会变成两单。下单不可逆,这是防重复下单的第一道闸。
|
||||
|
||||
可带 callback_url:任务到达终态(succeeded / failed / needs_human)或被置
|
||||
stale 时,网关向该地址 POST 一条 JSON 通知(best-effort 单次投递,§4.8)。
|
||||
幂等重发不会更新既有任务的回调地址。
|
||||
|
||||
提交后任务为 queued。进度跟踪用 GET /api/orders/{task_id}(任务状态 +
|
||||
完整状态历史);任务状态词汇表:queued / leased / running / succeeded /
|
||||
failed / needs_human / stale。
|
||||
"""
|
||||
data = await container.task_queue.submit(
|
||||
task_id=payload.task_id, site=payload.site, intent=payload.intent
|
||||
task_id=payload.task_id,
|
||||
site=payload.site,
|
||||
intent=payload.intent,
|
||||
callback_url=payload.callback_url,
|
||||
)
|
||||
return ApiResponse[SubmitOrderData](
|
||||
success=True, msg="success", data=data, code=0
|
||||
|
||||
Reference in New Issue
Block a user