为了处理HTTP请求,我们必须将阻塞调用(例如JDBC调用)作为基于mono/flux
的过程的一部分。我们目前的计划如下所示:
// I renamed getSomething to processJaxrsHttpRequest
CompletionStage<String> processJaxrsHttpRequest(String input) {
return Mono.just(input)
.map(in -> process(in))
.flatMap(str -> Mono.fromCallable(() -> jdbcCall(str)).subscribeOn(fixedScheduler))
.flatMap(str -> asyncHttpCall(str))
.flatMap(str -> Mono.fromCallable(() -> jdbcCall(str)).subscribeOn(fixedScheduler))
.toFuture();
}
其中FixedScheduler
跨HTTP请求并发使用。
我们希望得到一些关于这个策略的反馈,以便在相当数量的流量内处理块调用。当然,我们理解,如果所有的请求都经过这些阻塞调用,那么我们还不如不使用reactor(在公认不错的处理API之外)。
更新:感谢bsideup的回答。然而,我应该在我的问题上更具体一点。
我的总体问题是,如果可以大量创建/订阅多个流,如何有效地跨多个流使用阻塞调用。我们尝试了建议的方法,但它导致线程爆炸,并很快OOM。所以我们正在考虑使用一个共享调度器。所以..以下是我的问题。
fixedscheduler
)在我描述的情况下您会建议什么?如果没有,你能给我指个方向吗?schedulers.newparallel(“blocking-scheduler”,maxNumThreads)
?更新2:刚刚在调度器#newparallel
上挖了一个大坑,意识到这不起作用,因为它“拒绝”阻塞调用。
真的很感激任何提示!
虽然subscribeon
确实是处理阻塞调用的一种方法,而且您的用法也可以,但也可以使用publishon
。
它将处理移到提供的调度程序
,除非指定了其他publishon
:
CompletionStage<String> getSomething(String input) {
return Mono.just(input)
.map(in -> process(in)) // process must be non-blocking, or go after publishOn
.publishOn(Schedulers.boundedElastic())
.map(::jdbcCall)
.flatMap(str -> asyncHttpCall(str))
.publishOn(Schedulers.boundedElastic())
.map(::jdbcCall)
.toFuture();
}
如您所见,您也可以继续使用异步调用。只需确保您没有阻塞非阻塞调度器(在该示例中,我在FlatMap
之后再次使用Publishon
,因为AsynchTtpCall
可以从非阻塞调度器完成)
问题内容: 我正在开发一个Java脚本客户端应用程序,在服务器端我需要处理CORS,以及我用JERSEY用JAX-RS编写的所有服务。我的代码: 到目前为止,我收到错误消息在请求的资源上没有标头。因此,不允许访问源’ http:// localhost:8080 ‘。” 问题答案: 注意:请务必阅读底部的UPDATE @CrossOriginResourceSharing 是CXF批注,因此不适用
我对使用jersey jetty glassfish之类的web服务器/应用程序/servlet感到困惑。还有web.xml文件?什么?ResourceConfig只接受类,而不接受它们的实例。一切似乎都是那么的一团糟。 我怎么能就这样做类似的事情呢?
我正在开发一个java脚本客户端应用程序,在服务器端我需要处理CORS,所有我用JAX-RS和Jersey编写的服务。我的代码: 感谢佛普尼
如何使用Spring Webflux Netty reactor从阻塞调度器(阻塞池)切换回以前的调度器(reactor http nio)? 代码: 上面我使用的是publishOn(Schedulers.parallel()),但这一个创建了新的线程池(parallel)。相反,我更喜欢切换反应器http nio线程池。 实际结果日志: 预期结果日志:
问题内容: 我正在开发一个Java脚本客户端应用程序,在服务器端我需要处理CORS,以及我用JERSEY用JAX-RS编写的所有服务。我的代码: 到目前为止,我收到错误消息请求的资源上没有标头。因此,不允许访问源’ http:// localhost:8080 ‘。” 请协助我。 问题答案: 注意:请务必阅读底部的UPDATE 是CXF批注,因此不适用于Jersey。 对于Jersey,要处理CO
问题内容: 这是我到目前为止所拥有的: 这将初始化我的REST服务 我的服务如下所示: 我尝试将添加到中,但仍然出现异常: 在没有多部分配置的情况下调用Request.getParts。 在servlet中添加@MultipartConfig或在web.xml中添加multipart-config元素 。 谢谢 问题答案: 最终,我在没有Jersey耦合的情况下设法解决了这一问题。问题是注释不能与