Ich bin auf der Suche nach besseren Weg zu "schließen" einige Ressource, hier zerstören externe Process
, in CompletableFuture
Kette. Gerade jetzt mein Code sieht in etwa wie folgt aus:Schließen externen Prozess in CompletableFuture-Kette
public CompletableFuture<ExecutionContext> createFuture()
{
final Process[] processHolder = new Process[1];
return CompletableFuture.supplyAsync(
() -> {
try {
processHolder[0] = new ProcessBuilder(COMMAND)
.redirectErrorStream(true)
.start();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
return PARSER.parse(processHolder[0].getInputStream());
}, SCHEDULER)
.applyToEither(createTimeoutFuture(DURATION), Function.identity())
.exceptionally(throwable -> {
processHolder[0].destroyForcibly();
if (throwable instanceof TimeoutException) {
throw new DatasourceTimeoutException(throwable);
}
Throwables.propagateIfInstanceOf(throwable, DatasourceException.class);
throw new DatasourceException(throwable);
});
}
Das Problem, das ich sehe, ist ein „Hacky“ Ein-Elementanordnung, die sich auf den Prozess hält, so dass es im Falle eines Fehlers geschlossen werden kann. Gibt es eine CompletableFuture
API, die erlaubt, einige "Kontext" zu exceptionally
(oder eine andere Methode, um das zu erreichen) zu übergeben?
Ich dachte über benutzerdefinierte CompletionStage
Implementierung, aber es sieht aus wie eine große Aufgabe loszuwerden "Halter" Variable.
Erste Snippet kann ich nicht verwenden, weil '.waitFor' Blöcke und ich möchte möglicherweise sehr große' InputStream' (daher '.redirectErrorStream (true)', habe ich "Fehlererkennung" später, aber das ist eine andere Geschichte). Der zweite Weg scheint ein wenig verschachtelt (3 Futures, einschließlich 'CompletableFuture'), aber ich werde es versuchen. –
Xaerxess
Es blockiert in einer * asynchronen * Operation. Das ist der springende Punkt von 'thenAcceptAsync' oder gut,' CompleteableFuture' Stufen im Allgemeinen; unabhängige Stufen können gleichzeitig ausgeführt werden. Hier laufen 'PARSER.parse' und' process.waitFor' gleichzeitig in unabhängigen Stufen. – Holger
Ah, ich verstehe. Lass uns 'waitFor' dann versuchen! – Xaerxess