我正在使用Runtime.exec()在我的Jave Web应用程序中启动外部16位DOS程序(出于遗留应用程序兼容性原因)。我有流读取器来捕获进程的输出,我有一个计时器来中断,如果它需要太长时间,我使用Process.waitFor()等待进程完成后再分析捕获的输出。一切都运作良好,大部分时间。
问题是,当天第一次请求应用程序时(我们尚未生效),它会超时。我真的想做一些监控来告诉他们究竟发生了什么 - 生成过程是否在等待OS权限运行?流读者在等吗?当我昨天运行应用程序时,操作系统是否卸载了内存中的DOS程序,只需要一段时间再加载它?
这不是一个非常一致和可重现的东西,但似乎通常与整体计算机负载和应用程序上次运行后的时间长度有关。
无论如何,我希望能够识别进程运行的线程(这是一台Windows32机器,BTW),也许我可以说出一些东西,或者我可以调整该线程的优先级。如果没有,是否有任何类型的监控应用程序可以附加到tomcat或可能有用的netbeans?
谢谢,
Rebeccah
答案 0 :(得分:1)
无论如何,我希望能够识别进程运行的线程(这是一台Windows32机器,BTW),也许我可以说出一些东西,或者我可以调整该线程的优先级。
在纯Java中无法做到这一点,但是您可以通过使用反射在实际的Process
子类的私有字段中进行搜索来获得一些牵引力。 (在UNIXProcess
的情况下,UNIX pid存储在私有字段中......)
如果您希望获得的不仅仅是Java中的pid(或Windows等效项),或者您想要更改进程优先级,则需要通过JNI进行更改。 (我记得在UNIX上看到用于执行此类操作的Java +本机代码库。)
但说实话,我认为你最好以不同的方式解决这个问题。例如,如果这是“今天的第一次”,请尝试使用更长的超时。
答案 1 :(得分:0)
此时,像Process Monitor这样的外部工具将是您的最佳选择,以便检查处理的资源类型。
其中一个(如文件句柄)可以解释超时。