2016-07-11 4 views
0

これは愚かな質問かもしれませんが、私はまだ答えが見つからなかったので、質問する必要があります。私はakka-httpを使って、経路の典型的なルーティングパターンを使って、
とHttpRequestを完成させました。例えば他のアクタへの依存関係を持つリクエストにどのように応答するか?

~ path("reactJS") { 
    complete(
    HttpResponse(entity = HttpEntity(ContentTypes.`text/html(UTF-8)`, Source.fromFile(reactJS).mkString)) 
) 
} 

しかし、私は、ファイルシステムを扱う別の俳優を持っているし、その後、私の心に、私は、ファイルハンドラに上の要求を渡すために、サーバーをしたいと思いたいです俳優。ですから、私の質問は、自然に別の俳優に依存して自然にどのように要求を行うのでしょうか?右、サーバーの受信方法でケースでなければならないであろう

~ path("patient"/IntNumber) { index => 
     FileHandler ! index 
    } 

class FileHandler extends Actor{ 
    def receive = { 
    case msg:Int => sender() ! file handling 

} 

と要求のサービス提供:私は、サーバーがルーティングのように見えるのだろうと思いますか?探して

How to respond with the result of an actor call?

答えて

2

私はあなたの最善の策は頼むパターン(?)を使用して、バック頼むからくるFutureを処理するために、あなたのルーティングツリー内onCompleteディレクティブを使用することだと思います。あなたの例を取ると、あなたが尋ねる活用できるかを示すために、それを少し変更すると、以下の通りです:

path("patient"/IntNumber) { index => 
    import akka.pattern.ask 
    implicit val timeout = akka.util.Timeout(10 seconds) 
    val fut = (fileHandlerActor ? index).mapTo[String] 
    onComplete(fut){ 
    case util.Success(fileData) => 
     complete(HttpResponse(entity = HttpEntity(
     ContentTypes.`text/html(UTF-8)`, fileData)) 

    case util.Failure(ex) => 
     complete(HttpResponse(StatusCodes.InternalServerError)) 
    } 
} 

ここでの仮定は、あなたの俳優がHTTPレスポンスエンティティになることである文字列で応答していることです。また、このタイムアウトはaskを使用するための要件ですが、ここで範囲内にある限り、コード内の他の場所で簡単に定義できます。

+0

私はこれを作業コード(不特定の値のパラメータ:データ:ソース[ByteString、Any])として再現することに問題があると思います – stian

+0

あなたはonComplete(fut)を書く必要はありませんか? – stian

+0

@stian、はい、あなたは正しいです、私はコンパイルをチェックせずにすべての変更を加えました。私は正しい呼び出しを 'onComplete'に追加しました。ごめんなさい。 – cmbaxter

関連する問題