增强:工单创建增加重试机制(最多2次重试)
IoT ops 服务偶发 500 异常(auto_complete 后状态污染), 添加 3s/6s 间隔重试,避免暂时性故障导致工单丢失。
This commit is contained in:
@@ -132,28 +132,43 @@ class WorkOrderClient:
|
||||
|
||||
body_json = json.dumps(body, ensure_ascii=False, separators=(",", ":"))
|
||||
|
||||
try:
|
||||
headers = self._build_headers(body_json)
|
||||
url = f"{self._base_url}/open-api/ops/security/order/create"
|
||||
logger.info(f"创建工单请求: url={url}, body={body_json}")
|
||||
max_retries = 2
|
||||
for attempt in range(max_retries + 1):
|
||||
try:
|
||||
headers = self._build_headers(body_json)
|
||||
url = f"{self._base_url}/open-api/ops/security/order/create"
|
||||
if attempt == 0:
|
||||
logger.info(f"创建工单请求: url={url}, body={body_json}")
|
||||
|
||||
async with httpx.AsyncClient(timeout=self._timeout) as client:
|
||||
resp = await client.post(url, content=body_json, headers=headers)
|
||||
data = resp.json()
|
||||
async with httpx.AsyncClient(timeout=self._timeout) as client:
|
||||
resp = await client.post(url, content=body_json, headers=headers)
|
||||
data = resp.json()
|
||||
|
||||
if data.get("code") != 0:
|
||||
logger.error(f"创建工单失败: status={resp.status_code}, resp={data}, body={body_json}")
|
||||
if data.get("code") != 0:
|
||||
if attempt < max_retries:
|
||||
import asyncio
|
||||
wait = (attempt + 1) * 3
|
||||
logger.warning(f"创建工单失败(第{attempt+1}次), {wait}s后重试: code={data.get('code')}, msg={data.get('msg')}")
|
||||
await asyncio.sleep(wait)
|
||||
continue
|
||||
logger.error(f"创建工单失败(已重试{max_retries}次): status={resp.status_code}, resp={data}, body={body_json}")
|
||||
return None
|
||||
|
||||
# API 返回 {"code":0, "data": 1234567890} — data 直接是 orderId
|
||||
order_id = str(data.get("data", ""))
|
||||
logger.info(f"工单已创建: orderId={order_id}, alarmId={alarm_id}" + (f" (第{attempt+1}次尝试)" if attempt > 0 else ""))
|
||||
return order_id
|
||||
|
||||
except Exception as e:
|
||||
if attempt < max_retries:
|
||||
import asyncio
|
||||
wait = (attempt + 1) * 3
|
||||
logger.warning(f"创建工单异常(第{attempt+1}次), {wait}s后重试: {e}")
|
||||
await asyncio.sleep(wait)
|
||||
continue
|
||||
logger.error(f"创建工单异常(已重试{max_retries}次): {e}")
|
||||
return None
|
||||
|
||||
# API 返回 {"code":0, "data": 1234567890} — data 直接是 orderId
|
||||
order_id = str(data.get("data", ""))
|
||||
logger.info(f"工单已创建: orderId={order_id}, alarmId={alarm_id}")
|
||||
return order_id
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"创建工单异常: {e}")
|
||||
return None
|
||||
|
||||
async def auto_complete_order(
|
||||
self,
|
||||
order_id: str,
|
||||
|
||||
Reference in New Issue
Block a user