From 38111c6204cbbdc1f784fdedb03170fe33d000af Mon Sep 17 00:00:00 2001 From: Matthias Jaros Date: Thu, 20 Aug 2026 11:07:12 +0200 Subject: Get rid of RejectedExecutionException when cancelling a scan --- src/main/java/com/it_jaros/jns/scan/Scanner.java | 32 +++++++++++++++++------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/it_jaros/jns/scan/Scanner.java b/src/main/java/com/it_jaros/jns/scan/Scanner.java index 00cd937..9a62d52 100644 --- a/src/main/java/com/it_jaros/jns/scan/Scanner.java +++ b/src/main/java/com/it_jaros/jns/scan/Scanner.java @@ -4,6 +4,7 @@ import com.it_jaros.jns.scan.domain.ScanResult; import com.it_jaros.jns.scan.engine.*; import java.time.Duration; +import java.util.Optional; import java.util.concurrent.*; import java.util.function.Consumer; @@ -56,15 +57,7 @@ public class Scanner implements AutoCloseable { if (poll instanceof PollState.Success(ScanResult value)) { consumer.accept(value); } else if (poll instanceof PollState.Failure(Throwable error)) { - if (error instanceof RejectedExecutionException) { - // happens when strg-c is pressed - continue; - } - if (error instanceof ScanHostException e) { - consumer.accept(ScanResult.from(e)); - } else { - consumer.accept(ScanResult.from(error)); - } + mapToScanResult(error).ifPresent(consumer); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -73,6 +66,27 @@ public class Scanner implements AutoCloseable { scan.stop(); } + private Optional mapToScanResult(Throwable error) { + if (error instanceof RejectedExecutionException) { + // happens when Ctrl-C is pressed + // we don't want to tell the user that + // the host had an error because it did + // not get executed. Actually it is not + // even an error + return Optional.empty(); + } + + if (error instanceof ScanHostException e) { + if (e.getCause() instanceof RejectedExecutionException) { + // see comment above + return Optional.empty(); + } + return Optional.of(ScanResult.from(e)); + } + + return Optional.of(ScanResult.from(error)); + } + private PollState getHostResult(ProducerState state) throws InterruptedException { Future finishedHost = state.completionService().poll(ProducerThread.pollInterval.toMillis(), TimeUnit.MILLISECONDS); if (finishedHost == null) { -- cgit v1.3.1