Пожалуйста, поправьте меня, где я я иду не так.
Код: Выделить всё
@EnableAsync
@RestController
@Slf4j
@RequestMapping("/api")
public class MyController {
private final ThridPartyApi thridPartyApi;
private MyRequest asyncRequest;
@PostMapping("/big-data")
@ResponseStatus(HttpStatus.OK)
public DeferredResult getBigData(@RequestBody MyRequest request) {
if (asyncRequest == null) {
asyncRequest = request;
}
DeferredResult deferredResult = new DeferredResult(80000L);
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
CompletableFuture.supplyAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
try {
return thridPartyApi.getBigData(request);
} catch (IOException e) {
throw new RuntimeException(e);
}
}).thenAccept(response -> {
if (!deferredResult.isSetOrExpired()) {
deferredResult.setResult(AsyncApiResponse.createCompleted(response));
}
}).exceptionally(ex -> {
if (!deferredResult.isSetOrExpired()) {
deferredResult.setErrorResult(AsyncApiResponse.createCompleted(null));
}
return null;
});
if (!deferredResult.hasResult()) {
log.debug("Request processing is in progress >>>>>");
DeferredResult dr = new DeferredResult();
dr.setResult(AsyncApiResponse.createInProgress());
return dr;
}
log.debug("Request processing is done");
return deferredResult;
}
}
Похоже, deferredResult.setResult(AsyncApiResponse.createCompleted(response)) устанавливает результат, но когда дело доходит до строки, if (!deferredResult. hasResult()) Я вижу, что deferredResult не установлен.
Я ожидаю, что нашел его установленным, и, следовательно, if (!deferredResult.hasResult()) оценивается как false и возвращает deferredResult; вызывается с установленным значением.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -initially