From f4d7007b89cf565746af4623623a294b82666ff1 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期日, 11 十月 2026 02:33:06 +0800
Subject: [PATCH] 实时流重连改退避,测试已不存在时不再几秒一条刷日志

---
 src/views/TestConsole.vue |   14 +++++++++++++-
 1 files changed, 13 insertions(+), 1 deletions(-)

diff --git a/src/views/TestConsole.vue b/src/views/TestConsole.vue
index 7d7f28a..b8be3a4 100644
--- a/src/views/TestConsole.vue
+++ b/src/views/TestConsole.vue
@@ -24,6 +24,7 @@
 const testStatusLabel = ref('待测试')
 let closeLiveStream: (() => void) | null = null
 let reconnectTimer: number | null = null
+let reconnectAttempt = 0
 let disposed = false
 let stopPending = false
 const runtimeAttach = ref(false)
@@ -114,6 +115,8 @@
   liveConnection.value = next.sources.some(source => Boolean(source.latestSnapshot?.observedAt)
     || Boolean(source.latestSnapshot?.measurements?.length)) ? '已连接' : '空数据'
   liveError.value = ''
+  // 这一帧成功送达,重连退避回到起点。
+  reconnectAttempt = 0
   const nextState = ({ WAITING: '待测试', RUNNING: '检测中', PAUSED: '暂停', COMPLETED: '检测完成',
     // 历史数据仅兼容展示,不参与新生命周期流转。
     RUNNING_ABNORMAL: '检测中', COMPLETION_PENDING: '检测完成', TERMINATED: '检测完成' } as Record<string, ConsoleState | undefined>)[next.testStatus] || '待测试'
@@ -126,14 +129,23 @@
   else receptionState.value = '接收中'
 }
 
+/**
+ * 断线后重连:间隔按 2s、4s… 翻倍到 30s 封顶,收到快照即重置。
+ *
+ * 固定 2 秒重连在"这个测试已经不存在"时会一直空转——测试被删除后(ADR-0047 允许物理删除),
+ * 每次重连都会让服务端记一条错误日志,几秒一条地刷屏。退避不影响恢复能力(后端重启后最迟 30 秒接回),
+ * 只是不再把持续失败刷成一屏日志。
+ */
 function scheduleLiveReconnect() {
   if (disposed || reconnectTimer !== null) return
+  const delay = Math.min(2000 * 2 ** reconnectAttempt, 30000)
+  reconnectAttempt += 1
   reconnectTimer = window.setTimeout(async () => {
     reconnectTimer = null
     if (!backendDetail.value) { await loadConsole(); return }
     try { applyLiveState(await getTestLiveState(testId.value)); if (!disposed) connectLiveStream() }
     catch (error) { handleLiveError(error instanceof Error ? error : new Error('实时状态加载失败')) }
-  }, 2000)
+  }, delay)
 }
 
 function connectLiveStream() {

--
Gitblit v1.7.1