2016-12-21 5 views
2

スカラーでAKKA httpといくつかのアクターを実装しようとしています。 私はakkaでWebアプリケーションを作成しました。 しかし、私は1つまたは2つのdifferentsルート/ 16でこのエラーがあります。 (それは明らかにランダムです):アクターとのakka http:エラー503タイムアウト

サーバーはあなたの要求にタイムリーに応答することができませんでした。 しばらくしてからもう一度お試しください!

あなたはそれを修正する理由とその方法を教えてください。 私は本当にAkkaの初心者です。

メインクラス:

object WebServer extends App { 

    implicit val system = ActorSystem("app-1") 
    implicit val materializer = ActorMaterializer() 
    // needed for the future flatMap/onComplete in the end 
    implicit val executionContext = system.dispatcher 
    val routes = SessionRoute.route 
    val bindingFuture = Http().bindAndHandle(routes, ipServer, configApplication.getInt("spray.can.client.proxy.http.port")) 
    println("serv http launch") 
    StdIn.readLine 
    bindingFuture 
     .flatMap(_.unbind()) // trigger unbinding from the port 
     .onComplete(_ => { 
     cluster.close() 
     system.terminate() 
    }) 
    bindingFuture.onFailure { 
     case ex: Exception => 
      println(ex, "Failed to bind to {}:{}!", ipServer, configApplication.getInt("spray.can.client.proxy.http.port")) 
    } 
    } 

私のルートは以下のとおりです。

object SessionRoute extends TokenValidator { 
implicit val formats = org.json4s.DefaultFormats 

val sessionHandler = WebServer.system.actorOf(SessionHandler.props(), "SessionHandler") 
implicit val timeout = Timeout(60.seconds) 


val route: Route = get { 
    authenticated(doAuthPublisher) { app => 
     getActiveUserPublisher 
    } 
} 
def getActiveUserPublisher = 
    path("session"/JavaUUID/"active_user") { publisher_id => 
     parameters('date_start.as[Long], 'date_end.as[Long]) { 
      (date_start, date_end) => { 
       onSuccess(sessionHandler ? SessionActiveUser(SessionRequest(publisher_id, date_start, date_end, null))) { 
        case response: Answer => 
         complete(StatusCodes.OK, response.result) 
        case _ => 
         complete(StatusCodes.InternalServerError, "Error on the page") 
       } 
      } 
     } 

    } 
} 

私の俳優である:使用

object SessionHandler { 
     def props(): Props = { 
      Props(classOf[SessionHandler]) 
     } 
    } 
    class SessionService(implicit actorSystem: ActorSystem) extends toolService { 
    def activeUser(sessionRequest: SessionRequest): Map[String, Any] = { 
    .... 
     } 
    } 

class SessionHandler extends Actor with ActorLogging { 
    implicit val system = ActorSystem("session") 
    implicit val formats = org.json4s.DefaultFormats 

    def receive: Receive = { 
    case request: SessionActiveUser => 
    sender() ! Answer(Serialization.write(new SessionService().activeUser(request.sessionRequest))) 
    }} 

そして、私の場合クラス:

final case class Answer(result: String) 
case class SessionActiveUser(sessionRequest: SessionRequest) 
case class SessionRequest(publisher_id: UUID = null, date_start: Long, date_end: Long, app_id: String = null) 

マイconfiguration.conf:あなたが見るエラーが原因で発生し

akka { 
    loglevel = INFO 
    stdout-loglevel = INFO 
    loggers = ["akka.event.slf4j.Slf4jLogger"] 
    default-dispatcher { 
    fork-join-executor { 
     parallelism-min = 8 
    } 
    } 
// event-handlers = ["akka.event.slf4j.Slf4jLogger"] 
} 

答えて

1

あなたroute構成されたリクエストタイムアウト内に応答を生成することができません。明示的に設定していない場合、デフォルトは20秒です。要求タイムアウトの詳細については、hereを参照してください。

この問題の原因については、activeUserの機能の詳細を教えてください。そこで起こっている大きなブロッキングはありますか?その場合、着信要求はすべて逐次化され、activeUserに対してブロックされ、最終的に要求のタイムアウトが原因でリクエストが強制終了されます。

可能な解決策は以下のとおりです。

  • は、あなたのサービスの非同期/非ブロック
  • は、アッカ・HTTPルート
内部ブロッキング呼び出しに対処する方法について docsに追従させます
関連する問題