如何在tomcat提供的线程中设置Thread-local?
Posted
技术标签:
【中文标题】如何在tomcat提供的线程中设置Thread-local?【英文标题】:How to set a Thread-local in the thread provided by tomcat? 【发布时间】:2019-05-24 13:50:32 【问题描述】:因此,Tomcat 有自己的线程池,对于每个请求,它都会从该池中获取一个线程(线程 A),并在完成后使用并清除该线程。
当这个线程(线程 A)被初始化时,有没有办法初始化一个线程局部变量?
这里的目的是计算处理时间,我需要在创建线程时设置一个时间,并将使用这个时间来计算发送给客户端之前的处理时间。
【问题讨论】:
从另一个线程管理此问题的最佳方法是使用线程安全的Map<Thread, MyData>
@PeterLawrey 是的,这是我之前遵循的解决方案,但随后将排除 tomcat 处理和到达第一个配置的过滤器所需的时间,即使它非常短。我希望这次我也能登录。
您可以存储第一次读取的时间并稍后查找。理想情况下,您想要的是数据包在线上的时间(您可以使用 Solarflare 卡),这样您就知道从切换到 Java 的整个延迟。对于您的用例,您可能会发现亚毫秒延迟并不那么重要,尤其是如果您关注 99%ile 延迟(最差的 100 分之一)
这是自线程启动以来的总 CPU 时间,因此将包括线程为之前的请求所做的一切。
@PeterLawrey 我在第一个配置的过滤器中将初始时间记录为线程局部变量,即我的第一个应用程序代码开始的地方,我在需要时使用它。
【参考方案1】:
处理时间对应于Extended Access Log Valve 的time-taken 字段。在这种情况下,也许你不需要重新发明***。
【讨论】:
这个时间是否取决于发起请求的客户端的网络延迟? 不,应用程序正在写入和刷新它的 OutputStream,然后是网络接口将流量发送到客户端。如果客户端连接不良,您不应该在此字段中看到它。 好的。但在这种情况下,我需要计算系统/服务器中的执行时间并实施@Peter Lawrey 建议的解决方案。 我的回答需要 2 分钟来实现,如果您在完成并得出结论后可以发布两种方法的指标,那就太好了。 是的,我同意。但我会接受彼得的建议,因为我不想考虑客户端的连接速度。是的,我会尝试发布指标。以上是关于如何在tomcat提供的线程中设置Thread-local?的主要内容,如果未能解决你的问题,请参考以下文章