java - 访问远程应用程序服务器上的线程

标签 java servlets java-threads

我正在开发一个旧版 Java Web 应用程序,该应用程序在 JBoss 6 EAP 上运行并使用 servlet 构建。该应用程序部署在生产环境中的两个独立的Web服务器上,并且请求是负载均衡的。

该应用程序有一些在单独线程中运行的数据密集型进程。我试图做的是构建一个实用程序,允许管理用户查看有关在应用程序的两个实例上运行的线程的信息。将显示的唯一线程是由业务逻辑调用的线程。例如,服务器 A 上的用户应该能够看到服务器 A 和服务器 B 的线程信息。

这是通过服务器 A 调用 servlet B 上的 servlet - ThreadMonitor 来完成的,该 servlet B 执行以下方法。

public List<CustomProcess> getProcesses() {
  List<CustomProcess> allProcesses = new ArrayList<>();
  Map<Thread, StackTraceElement[]> allThreads = Thread.getAllStackTraces();
  if (allThreads != null) {
    Iterator<Thread> threadIterator = allThreads.keySet().iterator();
    while(threadIterator.hasNext()) {
      Thread thread = iterator.next();
      if (thread instanceof CustomProcess) {
        allProcesses.add(thread);
      }
    }
  }
  return allProcesses;  
}

问题在于,当服务器 B 上的 servlet 执行此方法时,服务器 B 上运行的业务逻辑启动的线程都没有返回。我检查了日志中是否有安全异常,没有发现任何表明存在问题的信息。

当然,服务器B上的应用程序可以直接调用该方法,并且返回我期望的线程。仅当处理来自服务器 A 的 HTTP 请求的 servlet 调用此方法时,才会出现此问题。

我在这里忽略了什么?

最佳答案

这个问题的解决与@xerx593 在他的评论中提到的内容有关。事实证明,基础设施团队在一台应用程序服务器上设置了两个 JVM。该应用程序部署到每个 JVM,要监视的线程正在其中一个 JVM 上运行,而向其发送所有线程列表请求的 Servlet 则位于另一个 JVM 上。

关于java - 访问远程应用程序服务器上的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54298320/

相关文章:

java - 使用 jSoup 从 XML 中的标签之间获取文本

java - In 无法解析为类型

java - Java SE 和 Java EE 之间的主要区别是什么?

servlets - 如何在servlet中获取表单参数? request.getAttribute 不起作用

java - 使用 MultiActionController 定义 Spring Rest API

java - 如果消费者线程遇到异常,如何停止生产者线程

java - Spring Data 模块需要运行哪个 JDK?

java - Java Parallel Stream 与 ExecutorService 的性能对比

java - Java中子线程如何向主线程(方法)发送连续的消息?

java - 为什么这段代码中有这么多 "\"……它有什么用……?