我正在开发一个运行在JBoss 6 EAP上并使用Servlet构建的旧版Java Web应用程序。该应用程序部署在生产环境中的两个单独的Web服务器上,并且请求是负载均衡的。
应用程序具有一些在单独的线程中运行的数据密集型进程。我正在尝试构建一个实用程序,该实用程序将允许管理用户查看有关在应用程序的两个实例上运行的线程的信息。将显示的唯一线程是业务逻辑调用的线程。例如,服务器A上的用户应该能够看到服务器A和服务器B的线程信息。
这是通过服务器A在执行以下方法的Servlet B上调用Servlet-ThreadMonitor-完成的。
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调用此方法时,才会发生此问题。
我在这里俯瞰什么?
答案 0 :(得分:0)
与此相关的解决方案与上面他的评论中提到的@ xerx593有关。事实证明,基础架构团队在一台应用程序服务器上设置了两个JVM。该应用程序已部署到每个JVM,并且要监视的线程正在运行其中一个JVM,而向其发送所有线程列表的请求的servlet在另一个JVM上。