如何在Undertow HttpHandler中发送异步响应

rei*_*kje 5 java jboss scala nonblocking undertow

我正在寻找一个示例,显示如何在异步HttpHandler中异步编写响应?问题是当调用HttpServerExchange.endExchange时,刷新响应.我的示例HttpHandler使用Scala的rx-java库.

class MyHandler() extends HttpHandler {
  override def handleRequest(exchange: HttpServerExchange) = {
    val observable = Observable.items(List(1, 2, 3)) // simplistic not long running
    observable.map {
      // this is run async
      myList => exchange.getResponseSender.send(myList.toString)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Stu*_*las 5

如果您调用dispatch()方法,则交换将不会在调用堆栈返回时结束,但是在这种情况下,即使这样做也很合理。

您可能想要类似:

exchange.dispatch(SameThreadExecutor.INSTANCE, () -> {
observable.map {
  // this is run async
  myList => exchange.getResponseSender.send(myList.toString)
}}
Run Code Online (Sandbox Code Playgroud)

基本上,这将等到调用堆栈返回后再运行异步任务,这意味着不存在争用的可能性。由于交换不是线程安全的,因此此方法可确保一次只能运行一个线程。

  • 在我看来,这需要“清楚地”记录,因为异步编写响应的能力是使用无阻塞http服务器的基础 (2认同)