我正在使用TwitterServer设置一个新的Rest服务器,它似乎阻止了一个新的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,则由于某种原因,第一个呼叫会阻止第二个呼叫。 知道为什么会这样吗?
答案 0 :(得分: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) ... }