На моей голове, если у нас есть @Async
аннотации, то я думаю, что тип возвращаемого значения должен быть типа CompletableFuture
, как обещание в javascript.
Таким образом, изменение типа возвращаемого значения для метода обслуживания с void
на CompletableFuture<Void>
решает проблему.
Итак, я изменил код, как показано ниже:
@Async("threadPoolTaskExecutor")
@Override
public CompletableFuture<Void> myAsyncFunction(String s) {
session.setAttribute("key", s);
return new CompletableFuture<Void>();
}
// Получить объект сеанса в Async
// Это неверный код, но проверить пригодность
Итак, я получаю объект сеанса из HttpRequest и передаю его в службу. Вы добавляете параметры в службу и проверяете эти параметры в контроллере.
Не подключайте объект сеанса автоматически к сервису или контроллеру.
@RequestScope
@Controller
public class SomeController {
@Autowired
private SomeServiceImpl iSomeService;
@ResponseBody
@GetMapping("/some-func")
public String someFunc(HttpServletRequest request) throws ExecutionException, InterruptedException {
HttpSession session = request.getSession();
CompletableFuture<HttpSession> completableFuture= iSomeService.myAsyncFunction(session, "hello");
HttpSession session1=completableFuture.get();
System.out.println(session1.getAttribute("key"));
return "ok";
}
}
@RequestScope
@Service
public class SomeServiceImpl {
@Async("threadPoolTaskExecutor")
public CompletableFuture<HttpSession> myAsyncFunction(HttpSession session, String s) {
session.setAttribute("key", s);
return CompletableFuture.completedFuture(session);
}
}