2011-12-21 197 views
0

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

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

有什么想法?

感谢

+0

你将如何从容器中获得所有线程? – 2011-12-21 07:31:11

+0

你的线程可能会在你迭代的时候完成,我宁愿在线程(servlets)内部记录URIs,也许在一个MBean里面... – home 2011-12-21 09:34:38

+0

有不同的方法来获得线程,但我最感兴趣的是Stack Traces我发现最简单的方法是使用静态方法:Thread.getAllStackTraces() – isapir 2011-12-22 01:46:08

回答

0

试试这个:

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

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

现在看起来有点艰辛,我读了它,但它应该是非常简单的。

//尼古拉斯

+0

嗨尼古拉斯,谢谢你的详细解释。我管理了它的一半(过滤器和同步弱哈希映射),但当我到达MBeans节时,我陷入了困境。我将尝试阅读更多关于MBeans的内容,并让这部分工作得到解决。再次感谢:) – isapir 2011-12-22 01:56:29

+0

如果你打算这样做,我想你也可以将请求对象添加到过滤器中的ThreadLocal中 – Kidburla 2015-11-18 19:29:13