gpt4 book ai didi

java - 在不同的事件循环上为不同的 webflux 端点提供服务

转载 作者:行者123 更新时间:2023-12-02 09:00:55 32 4
gpt4 key购买 nike

我已将大型 spring-web 代码库移植到 spring-webflux。有两组端点,一些关键端点必须很快,而另一些则不重要,如果它们最终在生产中阻塞的话。我可以验证事件循环线程上没有任何关键端点阻塞,但验证所有其他端点是不可行的。我想在不同的线程池或事件循环上运行它们,因此如果它们阻塞,它们不会影响关键端点。

我该如何解决这个问题?

我尝试使用反射来查找所有应该或不应该位于辅助事件循环上的处理程序,但无法想出一种将它们分配给它的方法。或者,是否可以同时运行 spring-web 和 spring-webflux,并让 spring-web 为非关键端点提供服务?

我已经成功地从处理程序注册表中获取了处理程序,如下所示:

@Component
class HandlerFinder(val requestMappingHandlerMappings: List<RequestMappingHandlerMapping>) {

@PostConstruct
fun start() {
for (rmhm : RequestMappingHandlerMapping in requestMappingHandlerMappings) {
val handlerMethods: Map<RequestMappingInfo, HandlerMethod> = rmhm.handlerMethods

for ((mapping, method) in handlerMethods) {
for (urlPattern in mapping.patternsCondition.patterns) {
log.info("${method.beanType.name}#${method.method.name} <-- ${urlPattern}")
}
}
}
}

companion object {
private val log = LoggerFactory.getLogger(HandlerFinder::class.java)
}
}

我认为下一步是以某种方式更改处理程序以将其包装在如下所示的内容中,但我不确定如何在处理程序注册表中更改它:

Mono.fromCallable(() -> { ... handler method goes here ...}).publishOn(Schedulers.elastic());

我知道我可以使用 rmhm.ungreisterMapping(mapping) 取消注册映射然后使用类似 rmhm.registerMapping(mapping, method.bean, method.method) 重新注册它,但我需要创建新方法来以某种方式包装现有方法。

最佳答案

我的建议是采用您不希望阻塞的关键端点并设置subscribeOn

作为documentation subscribeOn

的状态

Changes the Thread from which the whole chain of operators subscribes

您的选择publishOn只会更改已声明的上下文,并向前推进。 subscribeOn 会将整个订阅设置为专用调度程序。

这样,您就可以在应用程序内部的不同调度程序上划分您希望如何处理端点。

关于java - 在不同的事件循环上为不同的 webflux 端点提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166590/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com