获取 glassfish 上的 HTTP 线程数

Get the count of HTTP threads on glassfish

我在 Glassfish v3 中创建了一个专用线程池来处理特定的 HTTP 请求。我想在任何给定时间点获取非活动线程的数量(免费 - 而不是 运行),因为我需要根据工作线程的可用性来限制 HTTP 请求。有没有暴露的API得到这个?除非线程可用,否则我不想将请求提交到线程池。

回答你的问题: 据我所知,没有这样的 API 可以为你提供你需要的方便的细节,所以我认为你有自己计算。

对于解决方案部分: java.lang.management 包应该可以帮助你。

java.lang.management.ManagementFactory
ManagementFactory class 是一个工厂 class,用于为 Java 平台获取托管 bean。
您可以考虑使用 ManagementFactory,它允许您通过暴露的 Java 托管 bean 从 JVM 获取详细信息。对于您的情况,您可以使用 ThreadMXBean 来获取所有 JVM 线程信息。

java.lang.management.ThreadMXBean
Java 虚拟机线程系统的管理界面。
阅读 ThreadMXBean 文档和 API 彻底理解它,我认为最后你可以使用 java.lang.management.ThreadInfo 对象来获取你需要的所有信息。

java.lang.management.ThreadInfo
java.lang.management.ThreadInfo 为您提供了大量线程详细信息,如下所列。我不认为任何其他 Java class 可以提供这么多关于 Thread 的信息。

  • 线程 ID。
  • 线程名称。
  • 线程状态。
  • 线程被阻塞的对象:
    • 等待进入同步block/method,或
    • 等待在Object.wait方法中得到通知,或
    • 因 LockSupport.park 呼叫而停车。
  • 拥有线程被阻塞对象的线程ID。
  • 线程的堆栈跟踪。
  • 线程锁定的对象监视器列表。
  • 线程锁定的可拥有同步器列表。

下面是我为您创建的示例,请注意,这只是为了帮助您入门,无法提供完整的解决方案,因此请对其进行更多研究,但我认为会有帮助。
我正在获取所有线程状态并打印它们,因此您可以执行 IF-ELSE,然后根据状态等准备一些内容的列表,然后采取必要的操作。

希望对您有所帮助!

private static void getThreadInfo() {
    System.out.println("Started");
    ThreadMXBean managementFactory = ManagementFactory.getThreadMXBean();
    long threadIds[] = managementFactory.getAllThreadIds();
    for (int i = 0; i < threadIds.length; i++) {
        ThreadInfo info = managementFactory.getThreadInfo(threadIds[i]);
        System.out.println("Thread name = " + info.getThreadName() + " Thread id = " + info.getThreadId() + " Thread state = " + info.getThreadState());
    }

    System.out.println("#############");
    System.out.println(Thread.currentThread().getAllStackTraces());
}

输出:

Started
Thread name = Attach Listener Thread id = 5 Thread state = RUNNABLE
Thread name = Signal Dispatcher Thread id = 4 Thread state = RUNNABLE
Thread name = Finalizer Thread id = 3 Thread state = WAITING
Thread name = Reference Handler Thread id = 2 Thread state = WAITING
Thread name = main Thread id = 1 Thread state = RUNNABLE
#############
{Thread[Finalizer,8,system]=[Ljava.lang.StackTraceElement;@1748ba4, Thread[Attach Listener,5,system]=[Ljava.lang.StackTraceElement;@7bd86d, Thread[main,5,main]=[Ljava.lang.StackTraceElement;@bdff3b, Thread[Reference Handler,10,system]=[Ljava.lang.StackTraceElement;@1bf8a41, Thread[Signal Dispatcher,9,system]=[Ljava.lang.StackTraceElement;@dd841}