当使用带有 Mono
或 Flux
返回类型的 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/