1

我有两个应用程序,都是用 Java 编写的。第一个是一个简单的加载器/监视器 - 它检查远程站点上第二个应用程序的更新,如果可用则下载它们,然后使用Runtime.getRuntime().exec("javaw -jar MyApp.jar", null, new File("C:\MyWorkingDir")). 然后第一个应用程序坐在那里,定期检查第二个应用程序是否正在运行(使用 Sigar)并在它停止时重新启动它。它继续每小时检查一次更新,如果存在,则终止第二个应用程序,更新文件并重新启动它。

第二个应用程序在监控系统的各个方面后向/从管理器发送和接收 SNMP 消息,同样使用 Sigar。它还定期检查远程服务器上第一个应用程序的更新,并在可用时下载和更新。

如果我自己启动第二个应用程序(使用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 不是我的主要开发环境,由于问题定义相当模糊,我无法在其他地方找到任何指针。

有任何想法吗?

4

0 回答 0