Asynchronous REST Services with Lift
Note: REST and many other topics discussed within my upcomming book Lift in Action, more information will shortly be published on manning.com
This one is hot off the press - Lift 2.0-SNAPSHOT now has the ability to do notification style service workflows - essentially comet for REST.
So how does this work? Well, following on from my other post on REST services with Lift we are still using a DispatchPF
to setup the service, but we now use the statefull dispatcher LiftRules.dispatch
rather than statelessDispatchTable
and from inside our resource definition we call S.respondAsync
. Here’s a complete example:
LiftRules.dispatch.append {
case Req("example" :: rest, _, _) => {
S.respondAsync {
Thread.sleep(20000) // some computation here
Full(XmlResponse(<async>response</async>))
}
}
}
The call to S.respondAsync executes the function you pass to it on another thread and if the container you are using supports suspend / resume idiom Lift will pass control to the container and no threads are blocked during its execution; just return a Box[LiftResponse] like normal and Lift will handle notification to listening clients. Sweet.