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