Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>You can start your actors in an akka boot file or in your own ServletContextListener so that they are started without being tied to a servlet. Then you can look for them with the akka registry.</p> <pre><code>Actor.registry.actorFor[MyActor] foreach { _ !! (("Run",id), 10000) } </code></pre> <p>Apart from that there is no real integration for akka with scalatra at this moment. So until now the best you can do is by using blocking requests to a bunch of actors.</p> <p>I'm not sure but I wouldn't necessary spawn an actor for each request but rather have a pool of widget actors which you can send those requests. If you use a supervisor hierarchy then the you can use a supervisor to resize the pool if it is too big or too small.</p> <pre><code>class MyContextListener extends ServletContextListener { def contextInitialized(sce: ServletContextEvent) { val factory = SupervisorFactory( SupervisorConfig( OneForOneStrategy(List(classOf[Exception]), 3, 1000), Supervise(actorOf[WidgetPoolSupervisor], Permanent) } def contextDestroyed(sce: ServletContextEvent) { Actor.registry.shutdownAll() } } class WidgetPoolSupervisor extends Actor { self.faultHandler = OneForOneStrategy(List(classOf[Exception]), 3, 1000) override def preStart() { (1 to 5) foreach { _ =&gt; self.spawnLink[MyWidgetProcessor] } Scheduler.schedule(self, 'checkPoolSize, 5, 5, TimeUnit.MINUTES) } protected def receive = { case 'checkPoolSize =&gt; { //implement logic that checks how quick the actors respond and if //it takes to long add some actors to the pool. //as a bonus you can keep downsizing the actor pool until it reaches 1 //or until the message starts returning too late. } } } class ScalatraApp extends ScalatraServlet { get("/run/:id") { // the !! construct should not appear anywhere else in your code except // in the scalatra action. You don't want to block anywhere else, but in a // scalatra action it's ok as the web request itself is synchronous too and needs to // to wait for the full response to have come back anyway. Actor.registry.actorFor[MyWidgetProcessor] foreach { _ !! ((Run, id), 10000) } getOrElse { throw new HeyIExpectedAResultException() } } } </code></pre> <p>Please do regard the code above as pseudo code that happens to look like scala, I just wanted to illustrate the concept.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload