Since Netty is a non-blocking server, what effect does changing an action to using .async
?
def index = Action { ... }
versus
def index = Action { ... }
is non-blocking you are right.
The purpose of Action.async
is simply to make it easier to work with Futures
in your actions.
For example:
def index = Action.async {
val allOptionsFuture: Future[List[UserOption]] = optionService.findAll()
allOptionFuture map {
options =>
Ok(views.html.main(options))
}
}
Here my service returns a Future
, and to avoid dealing with extracting the result I just map it to a Future[SimpleResult]
and Action.async
takes care of the rest.
If my service was returning List[UserOption]
directly I could just use Action.apply
, but under the hood it would still be non-blocking.
If you look at Action
source code, you can even see that apply
eventually calls async
:
https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/scala/play/api/mvc/Action.scala#L432