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

Reply via email to