Chat-gpt пишет:
DeferredResult позволяет контроллеру продолжать выполнение после отправки ответа клиенту, а Callable возвращает результат в виде Future, который должен быть проверен клиентом для получения результата.
По факту заметил, что с DiferredRestult могу указывать сам пул потоков, а с Callable нет.
Это единственная разница или еще есть какие-то?
DiferredResult
@PostMapping("/search")
public DeferredResult<String> search(@RequestParam("searchWord") String searchWord, Model model, HttpSession session)
{
DeferredResult<String> result = new DeferredResult<>();
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(()->
{
List<Catalog> catalogs = repo.getAllCatalogs();
List<Product> allProducts = new ArrayList<>();
for(Catalog catalog : catalogs)
{
List<Product> products = repo.getProductsByCatalog(catalog);
allProducts.addAll(products);
}
allProducts.removeIf(o->!o.getName().toLowerCase().contains(searchWord.toLowerCase()));
List<ProductForSearch> products = new ArrayList<>();
for(Product prod:allProducts)
products.add(
new ProductForSearch(
prod.getId(),
prod.getName(),
Base64.getEncoder().encodeToString(prod.getImages().get().get(0))
)
);
model.addAttribute("products", products);
User user;
if(session.getAttribute("user")==null)
user = new User();
else
user = (User) session.getAttribute("user");
model.addAttribute("user", user);
result.setResult("searchResult");
});
return result;
}
Callable
@GetMapping("/favourites")
public Callable<String> showFavourites(HttpSession session,Model model)
{
User user = (User) session.getAttribute("user");
Callable<String> callable = ()->
{
List<Product> products = repo.getFavourites(user.getId());
List<ProductForSearch> prods = new ArrayList<>();
for(Product product:products)
prods.add(
new ProductForSearch(
product.getId(),
product.getName(),
Base64.getEncoder().encodeToString(product.getImages().get().get(0))
)
);
model.addAttribute("products", prods);
model.addAttribute(user);
return "user/favourites";
};
return callable;
}