diff options
| author | 2026-08-20 11:07:12 +0200 | |
|---|---|---|
| committer | 2026-08-20 17:03:39 +0200 | |
| commit | 38111c6204cbbdc1f784fdedb03170fe33d000af (patch) | |
| tree | c5b7b3886bd12b9d8df0e64646967b3dfee10f7c /src/main/java | |
| parent | 1d4735b670a8fb92f7be77bf115f2f792ba62c2f (diff) | |
Get rid of RejectedExecutionException when cancelling a scan
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/com/it_jaros/jns/scan/Scanner.java | 32 |
1 files 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>(ScanResult value)) { consumer.accept(value); } else if (poll instanceof PollState.Failure<ScanResult>(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<ScanResult> 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<ScanResult> getHostResult(ProducerState<ScanResult> state) throws InterruptedException { Future<ScanResult> finishedHost = state.completionService().poll(ProducerThread.pollInterval.toMillis(), TimeUnit.MILLISECONDS); if (finishedHost == null) { |
