Lambda中CompletableFuture的设置值

时间:2018-10-24 12:34:03

标签: java

我有以下代码:

public CompletableFuture<Object> send(String message) {
    CompletableFuture<Object> response =  new CompletableFuture<>();
    KafkaProducerRecord<String, String> record = ...
    KafkaProducer producer = ...
    producer.write(record, done -> {
        if(done.succeeded()) {
            Object o = ...
            response.complete(...);
        }
        else {
            Object o = ...
            response.complete(...);
        }
    });

    return response;
}

问题在于,无论response.complete()是true还是false,都在调用done.succeeded()并传递正确的值的同时,response.result始终以null返回。只有在返回之前在lambda表达式之外调用response.result时,才会设置response.complete()

在调用方法中,我尝试了以下操作:

CompletableFuture<IResponse> resp = this.send(message);
try {
  System.out.println(resp.get());
} catch (InterruptedException | ExecutionException e) {
  e.printStackTrace();
}

但是这挂了。将CompletableFuture包裹在Observable中,然后在Observable上执行subscribe()时,也是如此,如下所示:

Observable.fromFuture(this.send(message)).subscribe(i -> {});

任何人都可以提供帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

  

response.result始终以null返回

您是如何获得该字段的?计算结果后,它是一个内部字段。

要获取结果,您需要调用get(),它将阻塞直到结果准备好为止,或者调用isDone()来检查结果是否准备好。