【问题标题】:getting http request info from thread从线程获取http请求信息
【发布时间】:2011-12-21 07:11:18
【问题描述】:

是否可以从一个线程(不是当前线程)获取http请求信息?

我希望能够枚举所有活动线程并获取每个线程的请求 uri。

有什么想法吗?

谢谢

【问题讨论】:

  • 如何从容器中获取所有线程?
  • 您的线程可能会在您迭代时完成,我宁愿将 URI 记录在线程(servlet)中,可能记录到 MBean...
  • 有不同的方法来获取线程,但我最感兴趣的是堆栈跟踪,所以我发现最简单的方法是使用静态方法:Thread.getAllStackTraces()

标签: java multithreading servlets jmx mbeans


【解决方案1】:

试试这个:

  1. 创建一个servlet Filter
  2. 使其实现DynamicMBean。在 Filter 的 init 方法中注册 bean(并在 destroy 方法中取消注册)
  3. 定义一个synchronized WeakHashMap 字段。
  4. 在过滤器的doFilter 方法中,在调用FilterChaindoFilter 方法之前捕获请求的URI。将线程和请求 URI 插入 WeakHashMap。
  5. 调用链。
  6. 在 finally 块中,将当前线程和一些任意常量(如 NO REQUEST)插入 WeakHashMap。
  7. 实现 DynamicMBean 以便 MBeanInfo 在 WeakHashMap 中为每个线程提供一个 MBeanAttributeInfo。使属性名称成为线程的名称和类型为 URI(或 String)。
  8. 实现 DynamicMBean 以便 getAttribute 方法返回与请求的属性名称对应的线程的 URI。
  9. 配置过滤器,以便为您要跟踪的所有 URI 范围调用它。

当您查看 MBean 的属性时,您将看到 JVM 中仍处于活动状态且已处理至少一个请求的每个线程的 URI(或 NO REQUEST)。当线程终止时(可能在几个 GC 周期之后),WeakHashMap 条目将被删除。

现在读起来有点费劲,但应该很简单。

//尼古拉斯

【讨论】:

  • 嗨 Nicholas,感谢您的详细解释。我设法实现了其中的一半(过滤器和同步的弱哈希映射),但是当我到达 MBeans 部分时我被卡住了。我将尝试阅读更多关于 MBean 的内容,并将这部分内容也完成。再次感谢:)
  • 如果你打算这样做,我想你不妨将请求对象添加到过滤器中的ThreadLocal
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 2017-03-10
  • 2021-11-29
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多