Доступ к потокам на удаленном сервере приложений - PullRequest
0 голосов
/ 22 января 2019

Я работаю над устаревшим веб-приложением Java, которое работает на JBoss 6 EAP и построено с использованием сервлетов.Приложение развернуто на двух отдельных веб-серверах в производственной среде, и запросы сбалансированы по нагрузке.

Приложение имеет несколько процессов с интенсивным использованием данных, которые выполняются в отдельных потоках.Я пытаюсь создать утилиту, которая позволит администратору просматривать информацию о потоках, запущенных в обоих экземплярах приложения.Будут показаны только те потоки, которые вызываются бизнес-логикой.Например, пользователь на сервере A должен иметь возможность видеть информацию о потоках как для сервера A, так и для сервера B.

Это выполняется сервером A, вызывающим сервлет - ThreadMonitor - на сервлете B, который выполняет следующееmethod.

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 выполняет этот метод, ни один из потоков, запущенных бизнес-логикой, работающей на сервере B, не возвращается.Я проверил журналы на наличие исключений безопасности и не вижу ничего, что указывало бы на проблему.

Конечно, приложение на сервере B может вызывать этот метод напрямую, и ожидаемые потоки возвращаются.Проблема возникает только тогда, когда этот метод вызывается сервлетом, который обрабатывает HTTP-запрос, исходящий от сервера A.

Что я здесь пропускаю?

1 Ответ

0 голосов
/ 23 января 2019

Разрешение на это относится к тому, что @ xerx593 упомянул выше в своем комментарии. Оказывается, что у команды инфраструктуры есть две JVM, настроенные на одном сервере приложений. Приложение развернуто на каждой JVM, и отслеживаемые потоки выполняли одну из JVM, в то время как сервлет, которому отправлялся запрос списка всех потоков, находился на другой JVM.

...