Я новичок в весенней загрузке и хочу немного больше узнать о методах DeferredResult и @Async. Я создал метод в контроллере, как показано ниже, и он работал нормально.
@GetMapping("/temp/{id}")
public DeferredResult<ResponseEntity<?>> findByIdTemp(@PathVariable Long id) throws InterruptedException {
System.out.println("Request received : "+Thread.currentThread().getName());
final DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>();
ForkJoinPool.commonPool().submit(() -> {
System.out.println("Processing in separate thread");
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
}
deferredResult.setResult(ResponseEntity.ok("ok"));
});
System.out.println("Thread freed : " +Thread.currentThread().getName());
return deferredResult;
}
Ниже приведен вывод, который я получил.
Request received : http-nio-8080-exec-1
Thread freed : http-nio-8080-exec-1
Processing in separate thread
Затем я создал метод @Async в классе обслуживания и включил асинхронность в классе конфигурации.
@Configuration
@EnableAsync
public class ThreadPoolConfiguration {
@Autowired
private ExecutorConfiguration configuration;
@Bean(name = "threadPool")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
threadPool.setCorePoolSize(configuration.getDnCallBackPoolSize());
return threadPool;
}
}
@Async("threadPool")
public Future<String> getResult() throws InterruptedException {
System.out.println("Separate thread : "+Thread.currentThread().getName());
Thread.sleep(6000);
return new AsyncResult<>("Success");
}
Затем я вызвал сервисный метод из класса контроллера
@GetMapping("/temp/{id}")
public DeferredResult<ResponseEntity<?>> findByIdTemp(@PathVariable Long id) {
System.out.println("Request received : "+Thread.currentThread().getName());
final DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>();
ResponseDTO responseDTO = null;
try {
responseDTO = ResponseDTO.builder()
.status(HttpStatus.OK.toString())
.body(productService.getResult().get()).build();
ResponseEntity responseEntity = ResponseEntity.ok(responseDTO);
deferredResult.setResult(responseEntity);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
} catch (ExecutionException e) {
System.out.println(e.getMessage());
}
System.out.println("Thread freed : " +Thread.currentThread().getName());
return deferredResult;
}
Но полученный результат был другим
Request received : http-nio-8080-exec-1
Separate thread : dnCallBackPool-1
Thread freed : http-nio-8080-exec-1
Кажется, что метод контроллера ожидаетответ от метода обслуживания. Может кто-нибудь подскажите, пожалуйста, как правильно использовать DeferredResult с методами @Async.