【问题标题】:Checked exception with CompletableFuture [duplicate]使用 CompletableFuture 检查异常 [重复]
【发布时间】:2017-01-13 09:27:07
【问题描述】:

使用 Java 8 的强大功能 CompletableFuture,我想使用此新功能的异常来转换我的旧异步代码。但是检查的异常让我很困扰。这是我的代码。

CompletableFuture<Void> asyncTaskCompletableFuture = 
                CompletableFuture.supplyAsync(t -> processor.process(taskParam));

process方法的签名:

public void process(Message msg) throws MyException;

如何处理 ComletableFuture 中的检查异常?

【问题讨论】:

标签: java asynchronous java-8


【解决方案1】:

这种方式我试过了,不知道是不是解决问题的好办法。

@FunctionalInterface
public interface RiskEngineFuncMessageProcessor<Void> extends Supplier<Void> {
    @Override
    default Void get() {
        try {
            return acceptThrows();
        } catch (final Exception e) {
            throw new RuntimeException(e);
        }
    }

    Void acceptThrows() throws Exception;

使用Supplier的FunctionalInterface,我可以包装异常:

final MyFuncProcessor<Void> func = () -> {
            processor.process(taskParam);
            return null;
        };

        CompletableFuture<Void> asyncTaskCompletableFuture =
                CompletableFuture.supplyAsync(func)
                        .thenAccept(act -> {
                            finishTask();
                        })
                        .exceptionally(exp -> {
                            log.error("Failed to consume task", exp);
                            failTask( exp.getMessage());
                            return null;
                        });

【讨论】:

  • Void 是 JDK 中的一个类。您不应将其用作接口定义中的类型参数名称。要么删除它(因为它在这里似乎没有用),要么使用其他名称。常用单字母名称,我建议使用T,因为它是Supplier接口定义中使用的名称。
  • 看来你也不需要返回任何结果,所以你应该用runAsync()代替supplyAsync(),用thenRun()代替thenAccept()
  • 我建议抛出 CompletionException 而不是不特定的 RuntimeException。我会和CompletableFuture一起顺利工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2017-11-08
相关资源
最近更新 更多