我有以下代码:
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 -> {});
任何人都可以提供帮助,谢谢。
答案 0 :(得分:2)
response.result
始终以null返回
您是如何获得该字段的?计算结果后,它是一个内部字段。
要获取结果,您需要调用get()
,它将阻塞直到结果准备好为止,或者调用isDone()
来检查结果是否准备好。