summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-20 11:07:12 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-20 17:03:39 +0200
commit38111c6204cbbdc1f784fdedb03170fe33d000af (patch)
treec5b7b3886bd12b9d8df0e64646967b3dfee10f7c
parent1d4735b670a8fb92f7be77bf115f2f792ba62c2f (diff)
Get rid of RejectedExecutionException when cancelling a scan
-rw-r--r--src/main/java/com/it_jaros/jns/scan/Scanner.java32
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) {