Sono un po 'confuso.Play Framework 2.X e chiamata al database di blocco
Dal documentation:
Giocare pool di thread di default - Questo è il pool di thread predefinito in cui viene eseguito tutto il codice dell'applicazione in Play Framework, ad esclusione del codice iteratees. È un dispatcher Akka e può essere configurato da configurando Akka, descritto di seguito. Per impostazione predefinita, ha un thread per processore .
vuol portare beneficio per avvolgere una chiamata al database di blocco in un Future
, la chiamata al Future
essere in sé avvolto da un async
regolatore (riportandolo), al fine di lasciare che il pool di thread predefinita movimentazione altri utenti richieste?
Sposta semplicemente il codice di blocco all'interno di un altro thread (da un ExecutionContext dedicato), ma lascia lo Action
sbloccato.
Mi sono imbattuto in this post ma non sono soddisfatto della risposta data.
Infatti, se lascio il blocco delle chiamate del database all'interno del pool di thread predefinito, non impedirebbe potenzialmente la gestione di richieste di altri utenti che non dipendono dal database nel frattempo?
Nota: il mio database (Neo4j) non ha un driver asincrono.
Bella risposta :) In effetti, anche gli attori dedicati dietro a un router potevano fare il trucco. Ma non capisco perché l'altro post evochi: "Non hai nulla su cui non bloccare, quindi non c'è alcun motivo per rendere il controller asincrono". Se utilizzo la "soluzione ExecutionContext", devo avere un controller asincrono, siete d'accordo? – Mik378
'Action's sono asincroni di default, comunque. 'Action.async' è solo una comodità per trattare con' Future's. C'erano troppi aspetti negativi nella dichiarazione citata per essere veramente chiari. Rimanerei con il 'ExecutionContext' separato. –
Sì, lo so. La riproduzione è asincrona al 100%. 'Async' è solo un modo per gestire il futuro più facilmente. Ma se usassi il classico 'Action', dovrei fare la chiamata al database con un futuro, quindi' Await.result' (per ottenere il risultato), quindi specificare il risultato (come 'Ok (myResult)'), poiché 'Action' non restituisce un' Future [Result] 'ma semplicemente usa un futuro internamente. E 'Await' farebbe un blocco. – Mik378