【发布时间】:2016-11-16 09:26:52
【问题描述】:
我正在寻找更好的方法来“关闭”一些资源,这里销毁外部Process,在CompletableFuture 链中。现在我的代码大致是这样的:
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);
});
}
我看到的问题是一个“hacky”单元素数组,它包含对进程的引用,因此可以在出现错误时关闭它。是否有一些CompletableFuture API 允许将一些“上下文”传递给exceptionally(或其他一些方法来实现)?
我正在考虑自定义 CompletionStage 实现,但摆脱“持有人”变量似乎是一项艰巨的任务。
【问题讨论】:
标签: java java-8 completable-future