From 1de35281a699b8d2ca90777f63c7e032c3c9dc3d Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 12 十月 2026 13:34:34 +0800
Subject: [PATCH] 对接第 6 台新威上位机(7.6 客户端,走库路线),并修两处对接中暴露的问题
---
battery-device-bts/src/main/java/com/battery/device/bts/NewareBtsPipeTransport.java | 24 ++++++++++++++++++++++--
1 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/battery-device-bts/src/main/java/com/battery/device/bts/NewareBtsPipeTransport.java b/battery-device-bts/src/main/java/com/battery/device/bts/NewareBtsPipeTransport.java
index 1d1bc0e..afcc6ab 100644
--- a/battery-device-bts/src/main/java/com/battery/device/bts/NewareBtsPipeTransport.java
+++ b/battery-device-bts/src/main/java/com/battery/device/bts/NewareBtsPipeTransport.java
@@ -145,14 +145,14 @@
}
catch (TimeoutException ex)
{
- closeInFlight();
+ interruptRead();
pending.cancel(true);
throw new BtsTransportException(BtsTransportException.Reason.TIMEOUT,
"BTS 管道应答超时(" + responseTimeoutMs + " ms):" + pipePath, ex);
}
catch (InterruptedException ex)
{
- closeInFlight();
+ interruptRead();
pending.cancel(true);
Thread.currentThread().interrupt();
throw new BtsTransportException(BtsTransportException.Reason.IO_FAILURE,
@@ -347,6 +347,26 @@
try { pipe.close(); } catch (IOException ignored) { }
}
+ /**
+ * 在独立线程里关掉在途句柄,用来打断阻塞中的读。
+ *
+ * <p>为什么不自己关:实测关闭一条"服务端不作答的连接"**本身会阻塞**(关闭要等 SMB 层回收),
+ * 那样超时就白设了——调用线程照样被钉死。而这个实例是串行执行的(BTS 一条连接只服务一条请求,
+ * 注册表也按实例串行),一条不响应的命令足以把该实例之后的所有请求堵住。
+ * 关闭线程是守护线程且不等它结束:最坏情况是每次超时留一个挂着的关闭线程,
+ * 而超时本身应当罕见——真出现"某客户端不支持某命令",它的表现正是每次都无应答。
+ */
+ private void interruptRead()
+ {
+ RandomAccessFile pipe = inFlight;
+ if (pipe == null) return;
+ Thread closer = new Thread(() -> {
+ try { pipe.close(); } catch (IOException ignored) { }
+ }, "neware-bts-pipe-close");
+ closer.setDaemon(true);
+ closer.start();
+ }
+
@Override
public void close()
{
--
Gitblit v1.7.1