我正在寻找一个示例,说明如何在异步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)
}
}
}
答案 0 :(得分:4)
如果你调用dispatch()方法,交换将不会在调用堆栈返回时结束,但是在这种情况下即使这样也很有效。
您可能需要以下内容:
exchange.dispatch(SameThreadExecutor.INSTANCE, () -> {
observable.map {
// this is run async
myList => exchange.getResponseSender.send(myList.toString)
}}
基本上这将等到调用堆栈返回之后再运行异步任务,这意味着不存在竞争的可能性。因为交换不是线程安全的,所以这种方法确保一次只能运行一个线程。