Добрый вечер!
В контроллерах getDefer1, 2, 3 вы блокируете поток томкета, правильнее будет переделать на какой-нибудь вариант типо такого:
@GetMapping("/defer")
DeferredResult<String> getDefer() {
DeferredResult<String> result = new DeferredResult<>();
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(30000);
result.setResult("defer");
} catch (InterruptedException e) {
result.setErrorResult("Timeout");
}
}, mvcTaskExecutor());
return result;
}
Так должно работать так как вы хотите. С async не работает, потому что спринг не умеет перехватывать вызовы @Async внутри одного класса, нужно чтобы обязательно был другой бин