0

劇中!フレームワーク 2.1.x リクエストの内容に対して一貫性のない実行順序が表示されます。これは、私が実装しようとしているリクエスト ゲーティング コードでいくつかの問題を引き起こしています。

Filter、Action ラッパー、および Action で構成される次のサンプル コードについて考えてみましょう。

object AFilter extends EssentialFilter {
  def apply(nextAction: EssentialAction) : EssentialAction = new EssentialAction {
    def apply(request: RequestHeader): Iteratee[Array[Byte], Result] = {
        def readBody(nextA: EssentialAction, request: RequestHeader): Iteratee[Array[Byte], Result] = {

          def step(body: Array[Byte], nextI: Iteratee[Array[Byte],
              Result]) (i: Input[Array[Byte]]): Iteratee[Array[Byte], Result] = i match {
            case Input.EOF =>
              System.err.println("test 1")
              Iteratee.flatten(nextI.feed(Input.EOF))
            case Input.Empty =>
              Cont[Array[Byte], Result](step(body, nextI) _)
            case Input.El(e) =>
              val curBody = Array.concat(body, e)
              Cont[Array[Byte], Result](step(curBody,
                Iteratee.flatten(nextI.feed(Input.El(e)))) _)
          }

          val nextIteratee: Iteratee[Array[Byte], Result] = nextA(request)

          Cont[Array[Byte], Result](i => step(Array(), nextIteratee)(i))
        }

      readBody(nextAction,request)
    }
  }
}


def testActionWrapper[A](action: Action[A]): Action[A] = {
  Action(action.parser) {
    request => Async {
      System.err.println("test 2")
      Future.successful(action(request))
    }
  }
}
def testAction =
    testActionWrapper {
      System.err.println("test 3")
      Action(parse.empty) { request =>
        System.err.println("test 4")
        Async {
          System.err.println("test 5")
          Future.successful(Ok("Ok"))
        }
      }
    }

body と parse.json を含む POST、PUT、または GET では、println の実行順序は次のとおりです。

テスト 3、テスト 1、テスト 2、テスト 4、テスト 5

「テスト 3」が最初に発生するという事実を除けば、これは私が予想したことであり、アクション ラッパーが実行される前にフィルタ iteratee が完了します。しかし、本体のない単純な GET では、これが表示されます

テスト 3、テスト 2、テスト 1、テスト 4、テスト 5

フィルター iteratee が完了する前に、アクション ラッパーが実行されています。これは、アクションが iteratee を解析する独自の本体の実行をスキップしたためと考えられます。

私の質問ですが、これに対処する最善の方法は、体がない場合に iteratee もスキップすることですか? それとも、もっと要点を言えば、これは Scala Play の高度な同時実行の世界でのことを意味するのでしょうか! アクションが実行される前にフィルターが完了しなければならないという保証はありませんか?

4

0 に答える 0