Scala Play 2.7在75秒后重新执行动作的身体

时间:2019-09-20 11:57:52

标签: playframework

执行以下操作:

Action.async {
    implicit request: Request[AnyContent] => 
      logger.warn(s"CALL: $request")
      Future {
        blocking {
          Thread.sleep(120000)
          logger.warn("FINISHED")
          Ok("{}")
        }
      }
  }

我希望在t = 0时看到CALL,在t = 120时看到FINISHED。但是会发生以下情况:

t=0s: CALL
t=75s: CALL
t=120s: FINISHED
t=195s: FINISHED

然后页面显示“连接已重置”。

这是怎么回事!?

1 个答案:

答案 0 :(得分:1)

事实证明,默认情况下,Play使用带有host connection pool的Akka.Http。这意味着当第一个请求超时(play.server.http.idleTimeout默认为75s)时,它将自动重新发送请求。
specified仅重试幂等请求,这就是我弄错的地方:我的请求使用GET,但在服务器端触发的操作不是幂等的。因此,我应该改用POST。 Source