我有两个应用程序,都是用Java编写的。第一个是简单的加载器/监视器 - 它检查远程站点上第二个应用程序的更新,如果可用则下载它们,然后使用Runtime.getRuntime().exec("javaw -jar MyApp.jar", null, new File("C:\MyWorkingDir"))
启动第二个应用程序。第一个应用程序然后坐在那里,定期检查第二个正在运行(使用Sigar)并在它停止时重新启动它。它会每小时继续检查更新,如果存在,则会终止第二个应用程序,更新文件并重新启动它。
第二个应用程序在监视系统的各个方面后再次使用Sigar向管理员发送SNMP消息并从管理器接收SNMP消息。它还会定期检查远程服务器上第一个应用程序的更新,并在可用时下载和更新。
如果我自己启动第二个应用程序(使用javaw -jar MyApp.jar
),则应用程序正常运行。
如果我启动第一个应用程序(使用javaw -jar MyLauncher.jar
),则会发生以下两种情况之一。在我的开发机器上,它工作正常;在我测试过的所有其他服务器上,第二个到目前为止,然后在继续之前等待20分钟到2个小时之间的一段时间。如果我杀了第一个应用程序,第二个应用程序将立即继续正常。
没有特定的代码导致它停止 - 日志表明它发生在不同运行和不同机器上的不同位置。有时,它可能发生在两次连续调用log4j之间。例如,它停滞的一个地方是:
public static void Start(AgentConfig config) {
LogHelper.Log("Starting SNMP Listener on udp:127.0.0.1/" + config.get_listenerServerPort());
try {
LogHelper.Log("Creating address");
UdpAddress udpAddress = new UdpAddress("127.0.0.1/" + config.get_listenerServerPort());
<snipped for brevity>
} catch (Exception e) {
LogHelper.Error(e);
}
当它进入“等待模式”时,我们在日志中看到以下内容:
500 [main] INFO root - Starting SNMP Listener on udp:127.0.0.1/163
7199578 [main] INFO root - Creating address
所以,它似乎在进入try块时出现问题 - 但是在(7199578-500)ms = 7199s =差不多正好2个小时之后,它已经克服了这些并且无论如何都可以继续。
这些项目的代码被划分为四个项目 - 其他三个项目使用的常用例程(包括日志助手);文件更新程序(由其他两个使用);以及两个主要应用程序中的每一个的主要代码。我已经尝试将所需的项目添加到Eclipse中构建路径的项目部分,并为每个项目构建一个jar。两种情况都没有区别。每个项目使用log4j,文件更新程序使用commons-net-3-3,两个主要应用程序都使用Sigar,主要SNMP应用程序使用snmp4j。
我的开发机器(Win7 Pro 64位)上有JDK SE 7u25,服务器上有JRE SE 7u25(Win2003 Server R2 32位)。
Java不是我的主要开发环境,由于相当模糊的问题定义,我无法在其他地方找到任何指针。
有什么想法吗?