Ciao a tutti
l'altro giorno stavo chattando con un collega su CompletableFuture e
AsyncResponse di jax.rs. Lui, fan di spring, mi risponde che per rendere
una API REST asincrona ti basta scrivere una cosa come
@RequestMapping(value = "/callable", method = RequestMethod.GET)
public Callable<String> executeSlowTask() {
Callable<String> callable = taskService.execute();
return callable;
}
Cioè wrappa in un Callable tutto il codice sincrono e sequenziale che
hai, punto.
L'approccio non mi ha convinto. Tutte le attività potenzialmente
asyncrone, come le query verso un db o le chiamate http ad altri
servizi, vengono trattate come sincrone e gestite dal thread del thread
pool con cui `taskService` lavora.
Poi ho pensato che in effetti non ho fatto una scelta migliore quando ho
convertito tutte le API (java) a CompletableFuture, che di default si
basa sul `ForkJoinPool.commonPool()`, di nuovo un unico thread pool
comune a tutti i task.
Quindi qual è il modo migliore per far fare alla CPU altro lavoro mentre
è in attesa del risultato di una query?
Oppure ha ragione il mio collega e potevo risparmiarmi del lavoro?
federico