Любой способ идентифицировать / исследовать поток, в котором работает внешний процесс? - PullRequest
1 голос
/ 29 марта 2011

Я использую Runtime.exec () для запуска внешней 16-разрядной программы DOS (по причинам совместимости с устаревшими приложениями) в моем веб-приложении Jave. У меня есть потоковые считыватели для захвата выходных данных процесса, у меня есть таймер для прерывания, если это занимает слишком много времени, и я использую Process.waitFor (), чтобы дождаться завершения процесса, прежде чем анализировать захваченный вывод. Все работает хорошо, БОЛЬШЕ времени.

Проблема в том, что при первом запросе приложения за день (мы еще не живы), оно истекло. Я действительно хотел бы сделать какой-то мониторинг, чтобы сказать, что, черт возьми, происходит - порожденный процесс сидит без дела, ожидая разрешения ОС для запуска? Читатели потока ждут? Разве ОС выгружала программу DOS, которая была в памяти, когда я вчера запускал приложение, и для ее повторной загрузки требуется некоторое время?

Это не очень непротиворечивая и воспроизводимая вещь, но, как правило, она связана с общей нагрузкой на компьютер и временем, прошедшим с момента последнего запуска приложения.

В любом случае, я надеялся, смогу ли я определить поток, в котором выполнялся процесс (это машина с Windows32, кстати), возможно, я мог бы что-то сказать, или, возможно, я мог бы настроить приоритет этого потока. Если нет, есть ли какое-либо приложение для мониторинга, которое я могу подключить к tomcat или к netbeans, которые могут быть полезны?

Спасибо

Rebeccah

Ответы [ 2 ]

1 голос
/ 29 марта 2011

В любом случае, я надеялся, что смогу определить поток, в котором выполнялся процесс (это машина с Windows32, кстати), возможно, я мог бы что-то сказать, или, возможно, я мог бы настроить приоритет этого потока.

Невозможно сделать это на чистой Java, но вы могли бы добиться некоторой тяги, используя отражение, чтобы покопаться в приватных полях фактического подкласса Process.(В случае UNIXProcess pid UNIX хранится в закрытом поле ...)

Если вы хотите получить больше, чем pid (или эквивалент Windows) в Java, или если вы хотитеизменить приоритет процесса, вам нужно будет сделать это через JNI.(Я помню, как видел библиотеку нативного кода Java + для таких вещей в UNIX.)


Но, честно говоря, я думаю, что вам лучше решить эту проблему другим способом.Например, попробуйте использовать более длительное время ожидания, если это «первый раз за день».

0 голосов
/ 29 марта 2011

На данный момент, внешний инструмент, такой как Process Monitor , будет вашим лучшим вариантом для проверки того, какие ресурсы хранит этот процесс.
Один из них (например, дескриптор файла) может объяснить время ожидания.

...