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

时间:2014-08-08 13:40:23

标签: java scala jboss nonblocking undertow

我正在寻找一个示例,说明如何在异步HttpHandler中异步编写Response?问题是当调用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)
    }
  }
}

1 个答案:

答案 0 :(得分:4)

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

您可能需要以下内容:

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

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