Play-slick z SecureSocial: Uruchamianie DB IO w oddzielnej puli wątków
Mam aplikację Play 2.2.1play-slick 0.5.0.8 utrzymywać dane w zapleczu Postgresql iSecureSocial 2.1.2 do obsługi autoryzacji użytkownika.
Ponieważ transakcje play-slick są blokowane, stworzyłem osobnąslick-context
kontekst wykonania w moim/conf/application.conf
plik, jak winstrukcje znalezione w Wiki wtyczki:
play {
akka {
actor {
slick-context = {
fork-join-executor {
parallelism-min = 300
parallelism-max = 300
}
}
}
}
}
Dzięki temu mogę utworzyć akcję kontrolera, która działa w osobnym kontekście wykonywania i nie blokuje wątków w domyślnej puli wątków. Na przykład./app/controllers/Application.scala
:
Przykład pierwszy - Korzystanie z DBAction na play-slick:
import play.api.db.slick._
object Application extends Controller{
// this controller Action won't block threads in the default pool since DBAction uses my separate slick-context execution context
def recipes = DBAction { implicit rs =>
val recipes = Query(Recipes).list
Ok(recipes.mkString)
}
}
W przypadku niektórych działań kontrolera chcę mieć możliwość korzystania z akcji SecureSocial (SecuredAction
, UserAwareAction
itp.) w połączeniu z play-slickamiDBAction
. Jaki jest najlepszy sposób na połączenie tych dwóch?
Zdaję sobie sprawę, że mogę zrobić coś takiego jak poniżej, ale rozumiem, że połączenie DB nie będzie korzystać z mojego oddzielnegoslick-context
i dlatego zablokuje domyślną pulę wątków:
Przykład drugi - Korzystanie z akcji SecureSocial:
import play.api.db.slick._
import securesocial.core._
object Application extends Controller{
// changing from a DBAction to a SecuredAction so that I can use SS's goodies
def recipes = SecuredAction { implicit request =>
val recipes = DB.withSession { implicit session:Session => Query(Recipes).list } // i'm guessing this WILL BLOCK the default thread pool since it isn't using my separate slick-context execution context??
Ok(recipes.mkString)
}
}
Czy poprawne jest założenie, że przykład drugi użyje / zablokuje domyślną pulę wątków zamiast mojej oddzielnejslick-context
pula wątków? Jeśli tak, czy istnieje sposób, aby to zmienić?
Oczywiście mogłem to obejśćpodbijanie domyślnej puli wątków Play (default-dispatcher
), ale idealnie chciałbym, aby domyślna pula wątków była dość uboga i uruchamiał wszystkie blokujące wywołania DB w osobnej puli.
Pomoc mile widziana!