2015-08-26 1 views
1

В моем приложении Spray я передаю запросы актерам. Я хочу уметь убить актера, который занимает слишком много времени. Я не уверен, должен ли я использовать тайм-ауты Spray, шаблон Akka или что-то еще.Убейте актера, если он истекает время в приложении Spray

Я выполнил:

def processRouteRequest(system: ActorSystem) = { 
    respondWithMediaType(`text/json`) { 
    params { p => ctx => 
     val builder = newBuilderActor 
     builder ! Request(p) // the builder calls `ctx.complete` 
     builder ! PoisonPill 
     system.scheduler.scheduleOnce(routeRequestMaxLife, builder, Kill) 
    } 
    } 
} 

Идея заключается в том, что актер живет только на протяжении одного запроса, и если он не завершается в течение routeRequestMaxLife он получает насильственно убит. Этот подход кажется чрезмерным (и выводит много информации о недоставленных сообщениях). Я даже не уверен, что он работает правильно.

Кажется, что я пытаюсь достичь, должен быть обычным прецедентом. Как мне подойти к нему?

ответ

1

Я бы, как правило, с использованием задать шаблон и обработки запросов следующим образом:

class RequestHandler extends Actor { 

    def receive = { 
    case "quick" => 
     sender() ! "Quick Reply" 
     self ! PoisonPill 

    case "slow" => 
     val replyTo = sender() 
     context.system.scheduler.scheduleOnce(5 seconds, self, replyTo) 

    case a:ActorRef => 
     a ! "Slow Reply" 
     self ! PoisonPill 
    } 
} 

class ExampleService extends HttpService with Actor { 
    implicit def actorRefFactory = context 

    import context.dispatcher 

    def handleRequest(mode: String):Future[String] = { 
    implicit val timeout = Timeout(1 second) 
    val requestHandler = context.actorOf(Props[RequestHandler]) 
    (requestHandler ? mode).mapTo[String] 
    } 

    val route: Route = 
    path("endpoint"/Segment) { str => 
     get { 
     onComplete(handleRequest(str)) { 
      case Success(str) => complete(str) 
      case Failure(ex) => complete(ex) 
     } 
    } 
    } 

    def receive = runRoute(route) 
} 

Таким образом, актер заботится о останавливая себя, и семантика Ask дать вам информацию о том или нет истекло время запроса.

Смежные вопросы