2

Play2 では、アクション構成の概念と、非同期応答に Async {...} を使用することの概念は理解していますが、これらのアプローチが一緒に使用されている例は見たことがありません。

明確にするために、ユーザーが認証されていることを確認するためにアクション構成を使用しているとします。

  def index = Authenticated { user =>
   Action { request =>
     Async {
        Ok("Hello " + user.name)      
     }
   }
  }

の実装でAuthenticated、ユーザーを取得するために DB がルックアップされていると仮定すると、この部分がブロッキング呼び出しになり、Actionボディ内の応答のみがノンブロッキングとして残されるように見えます。

認証部分も含む非ブロック非同期 I/O を行う方法を誰かが説明できますか?

4

2 に答える 2

0

私の解決策は、次のようにアクションを裏返しに構成することでした。

def index = Action { request =>
  Async {
    Authenticated { user =>
      Ok("Hello " + user.name)      
    }
  }
}

私のAuthenticated署名は次のようになります。

def Authenticated(body: => Result): Result = {
  // authenticate, and then
  body
}

ここでの欠点は、認証の前に本文の解析が行われることです。これは、問題になる場合とそうでない場合があります。

于 2013-02-10T00:21:47.703 に答える
0

完全な例を挙げることができます: http://pastebin.com/McHaqrFv

その本質は次のとおりです。

  def WithAuthentication(f: WithAuthentication => Result) = Action {
    implicit request => AsyncResult {
      // async auth logic goes here
    }
  }

コントローラでは単純に:

  def indexAction = WithAuthentication {
    implicit request =>
      Ok(views.html.index())
  }

あるいは:

  def someAction = WithAuthentication {
    implicit request => Async {
      // more async logic here
    }
  }

これはテンプレートに適したソリューションです。自由に使用してください。たぶん、それからプラグインを作成することがあります。私のアプリケーション用にコーディングしただけで、これまでのところ動作しているようです。

于 2013-05-31T11:01:13.110 に答える