java - 如何使用 Spring Webflux 和 Tomcat 调试已发布的连接?

标签 java spring tomcat spring-webflux

当使用带有 MonoFlux 返回类型的 Spring webflux 时,http 连接线程在连接等待响应时被停放/释放。因此,连接未占用 max-connections

问题:如何测试/证明连接在等待响应时确实已释放,并且不阻塞最大连接数?

我已经启用了DEBUG 日志记录,但是没有显示任何关于这个问题的信息。

@RestController
public class MyServlet {
   @GetMapping("/")
   public Mono<String>/Flux<String> test() {
       return Mono.just(service.blocking());
   }
}

@Service
public class SlowService {
    public String blocking() {
        TimeUnit.SECONDS.sleep(10);
        return "OK";
    }
}

或者这根本不正确,我必须使用:

Mono.fromCallable(() -> service.blocking()).subscribeOn(Schedulers.elastic());

但是,我如何从日志中看出连接已正确停放?

为了测试,我使用了 server.tomcat.max-threads=5。我正在尝试重写我的阻塞服务,以便这些线程在 sleep 期间不会被阻塞,因此超过 5 个连接可以同时到达我的服务。

最佳答案

有 2 个线程池,forkjoin 池将处理所有常规工作。然后您将拥有处理计划任务的计划池。

return Mono.just(service.blocking());

这将阻塞 ForkJoinPool 中的线程之一,因此 webflux 可以处理的事件较少,从而减慢您的服务。

Mono.fromCallable(() -> service.blocking()).subscribeOn(Schedulers.elastic());

这将分配任务并将其“卸载”到线程的调度程序池,以便另一个线程池将处理此任务而不是占用其中一个 ForkJoinPool 线程。

如何测试这个?您需要对您的服务进行负载测试,或者像大多数人所做的那样,相信框架会执行其设定的任务,并相信 Spring 团队已经测试了他们的方面。

关于java - 如何使用 Spring Webflux 和 Tomcat 调试已发布的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57304339/

相关文章:

java - 重新安装 Eclipse 后无法再构建项目

java - 方法类型的 Spring REST 最佳实践

maven - 如何使用可嵌入的tomcat访问maven项目结构中的tomcat servlet

java - 在 SWT 中获取组组合内的所有复选框

java - 如何利用速度和时间计算下一次的经纬度

spring - 使用 Spring 3 验证向导页面

java - Localhost - 连接重置错误

maven - 如何使用tomcat :run?运行maven war依赖

java - 在 Idea 和私有(private) Artifact 存储库中使用 Gradle

Spring MVC Tomcat启动失败