diff --git a/src/main/java/com/lion/lionwebsite/Service/RemoteService.java b/src/main/java/com/lion/lionwebsite/Service/RemoteService.java index 0da5184..ebe851e 100644 --- a/src/main/java/com/lion/lionwebsite/Service/RemoteService.java +++ b/src/main/java/com/lion/lionwebsite/Service/RemoteService.java @@ -386,6 +386,13 @@ public class RemoteService { } finally { monitorSocket = null; monitoring.set(false); + // A connection may flap while the previous monitor is still exiting. + if (!stopping && isDead()) { + try { networkGroup.next().schedule(this::startMonitor, 5, TimeUnit.SECONDS); } + catch (java.util.concurrent.RejectedExecutionException e) { + if (!stopping) log.warn("安排节点监听重试失败", e); + } + } } } diff --git a/src/test/java/com/lion/lionwebsite/Util/ImageFileCacheTest.java b/src/test/java/com/lion/lionwebsite/Util/ImageFileCacheTest.java index 31cdd99..d4ddaf4 100644 --- a/src/test/java/com/lion/lionwebsite/Util/ImageFileCacheTest.java +++ b/src/test/java/com/lion/lionwebsite/Util/ImageFileCacheTest.java @@ -25,6 +25,9 @@ class ImageFileCacheTest { assertThrows(Exception.class, () -> ImageFileCache.get(cache, "1", () -> root.resolve("missing.gif").toUri().toString())); assertNull(ImageFileCache.find(cache, "1")); try (var files = Files.list(cache)) { assertEquals(0, files.count()); } + Path source = root.resolve("retry.gif"); + Files.writeString(source, "GIF89a retry"); + assertNotNull(ImageFileCache.get(cache, "1", () -> source.toUri().toString())); } @Test void concurrentCallersShareTheSameOperation() throws Exception {