首页 > 解决方案 > 知道请求在 Tomcat 队列中等待了多长时间

问题描述

我们正在开发一种使用异构后端工具集的产品。REST API 主要是在 Python 中,然后有时 Python 需要通过 REST 同步调用 Java 服务器。我们需要一些指标来帮助我们了解 Java 服务器是否过载并且我们需要一个 Java 容器。Java 进程的繁忙线程数或 CPU 利用率是好的,但我想看看请求在 Tomcat 队列中等待多长时间(如果有的话),然后它们开始被 Tomcat 线程池执行。在涉及 RabbitMQ 的异步场景中,这些指标随 RabbitMQ 一起提供,但我说的是同步场景。

现在最有趣的部分开始了。我找不到通知消息命中接受线程或被放入等待队列的方法。我所能得到的只是消息即将开始处理时的通知,通过扩展HandlerInterceptorAdapter和实现preHandle方法(我使用 Spring Boot)。我故意将工作线程的数量减少到 1 个,每两秒发送 3 个请求,在我的 REST 处理程序中休眠 10 秒。这个测试表明,HandlerInterceptorAdapter.preHandle它恰好在线程开始执行请求之前被调用,而不是在 Tomcat 将请求排队时调用,因为所有线程都很忙。

这看起来合乎逻辑,因为如果所有线程都忙,Tomcat 将如何让我们知道请求已排队?通过执行我们提供的一些代码?如果所有人都忙,在什么线程的上下文中?我试过过滤器,但它也没有帮助解决同样的症状。它在拦截器之前立即被解雇。

是否有可能在不向 HTTP 标头添加时间请求的情况下实现我想要的?我不愿意这样做,因为时间可能在托管容器的机器上设置不正确,或者更糟糕的是,它可能会前后波动几秒钟。

标签: javaspring-boottomcat

解决方案


推荐阅读