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