ho voluto analizzare il miglioramento io veda consentendo controller asincroni in primavera avvio nel corso del controller normaleAsync Primavera Controller vs controllori normali
Così qui è il mio codice di prova. Una API restituisce un Callable e un'altra è una normale API del controller. Entrambe le API blocco per 10s simulare un'operazione lunga corsa
@RequestMapping(value="/api/1",method=RequestMethod.GET)
public List<String> questions() throws InterruptedException{
Thread.sleep(10000);
return Arrays.asList("Question1","Question2");
}
@RequestMapping(value="/api/2",method=RequestMethod.GET)
public Callable<List<String>> questionsAsync(){
return() -> {
Thread.sleep(10000);
return Arrays.asList("Question2","Question2");
};
}
a impostare tomcat incorporato con questa configurazione ovvero solo una tomcat thread di elaborazione:
server.tomcat.max-threads=1
logging.level.org.springframework=debug
aspettative per/api/1 Poiché esiste un solo thread tomcat, un'altra richiesta non verrà intrattenuta fino a quando non verrà elaborata dopo 10 secondi
Risultati: soddisfare le aspettative
aspettative per/api/2 Dal momento che stiamo tornando subito un callable, l'unico filo di Tomcat dovrebbe ottenere gratuitamente per elaborare un'altra richiesta. Callable avvierebbe internamente una nuova discussione. Quindi se colpisci la stessa API dovrebbe anche essere accettato.
Risultati: Ciò non sta accadendo e finché il richiamabile non viene eseguito completamente, nessuna ulteriore richiesta viene intrattenuta.
Domanda Perché/api/2 non si comporta come previsto?
Tomcat esegue un threadpool, hai aspettative sbagliate. –
@RomanC Ho menzionato in questione, ho impostato il threadpool del tomcat per contenere solo 1 thread. – hellojava
Solo per essere sicuri: quale tipo di "altra richiesta" si invia mentre il filo della molla dorme? –