Я работаю над устаревшим веб-приложением 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.
Что я здесь пропускаю?