0

我正在使用 TwitterServer 设置一个新的休息服务器,它似乎阻止了一个新的 api 调用,直到前一个调用完成。

以下是对https://twitter.github.io/twitter-server文档中基本代码的简单修改:

import com.twitter.finagle.{Http, Service}
import com.twitter.finagle.http.{Request, Response, Status}
import com.twitter.server.TwitterServer
import com.twitter.util.{Await, Future, FuturePool}

object BasicServer extends TwitterServer {
  val service = new Service[Request, Response] {
    def apply(request: Request): Future[Response] = {
      FuturePool.unboundedPool {
        Thread.sleep(10000)

        val response = Response(request.version, Status.Ok)
        response.contentString = "hello"

        response
      }
    }
  }

  def main(): Unit = {
    val server = Http.serve(":8888", service)
    onExit {
      server.close()
      ()
    }
    Await.ready(server)

    ()
  }
}

如果我尝试多次调用http://localhost:8888,由于某种原因,第一次调用会阻止第二次调用。知道为什么会这样吗?

4

1 回答 1

1

您不应该将 Thread.sleep 与 Finagle 一起使用(也不应该与任何其他非阻塞解决方案一起使用)……这些解决方案中的大多数都是因为线程不会长时间阻塞。

Thread.sleep 正在使用任何本地线程在其上休眠,这将阻塞糟糕的服务器,恕不另行通知。

作为睡眠的解决方案,请使用 Future.sleep,如下所示:

import com.twitter.conversions.DurationOps._ // for the 5.seconds part to work
import com.twitter.util._

implicit val twitterTimer = new ScheduledThreadPoolTimer // for the sleep time to work

Future.sleep(5.seconds) flatMap FuturePool.unboundedPool { ...(and remove the Thread.sleep inside) ... }
于 2020-02-03T19:49:23.783 回答