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)
如果您调用dispatch()方法,则交换将不会在调用堆栈返回时结束,但是在这种情况下,即使这样做也很合理。
您可能想要类似:
exchange.dispatch(SameThreadExecutor.INSTANCE, () -> {
observable.map {
// this is run async
myList => exchange.getResponseSender.send(myList.toString)
}}
Run Code Online (Sandbox Code Playgroud)
基本上,这将等到调用堆栈返回后再运行异步任务,这意味着不存在争用的可能性。由于交换不是线程安全的,因此此方法可确保一次只能运行一个线程。