BAT文件未使用Runtime.exec()完全执行

时间:2012-01-06 05:10:33

标签: java batch-processing bcp runtime.exec

我有一个BAT文件,通过读取数据库表创建了许多csv文件。 bcp.exe用于此目的,因此,对于从表创建的每个CSV,都有一个单独的bcp.exe调用。所有这些都可以在BAT文件中找到,我使用Runtime.exec()调用它。

现在我面临的问题是随机的。它不能在开发人员环境中重新创建,但在生产环境中偶尔会发生一次。

有时在执行BAT文件后,只创建了少量CSV文件,其余文件丢失了。但是当你重新执行相同的操作时,你会获得所有的CSV。

以下是代码:

        String command = "cmd /C " + batFilePath + " " + batParams;
        LOGGER.info("Executing : " + command);
        Runtime rt = Runtime.getRuntime();
        Process process = rt.exec(command);

        process.getInputStream();
        is = process.getInputStream();
        isr = new InputStreamReader(is);
        br = new BufferedReader(isr);

        String line;

        while ((line = br.readLine()) != null) {
            LOGGER.info(line);
        }

如果有人能够告诉我这可能发生的事情,我会非常感激,因为我在海上都是这样。

提前致谢,

-Raj。

2 个答案:

答案 0 :(得分:3)

只有几点。

首先,我从未理解为什么Java坚持使用getInputStream获取流程的输出流 - 这简直就是奇怪的。但那只是我的咆哮,你无能为力: - )

其次,我不确定为什么你的代码中有“裸”process.getInputStream();。我认为这不好但似乎没必要。

第三(并且,老实说,这是我认为唯一可能有帮助的方法),您需要调试批处理文件本身而不是Java代码。

这可以通过以下两个建议来完成。

首先,获取错误流并查看它。 cmd很有可能提供您忽略的错误信息。

其次,更改批处理文件以输出大量的调试语句,必要时在每行之后输出一个。这有望将问题精确定位到批处理文件中的特定位置。

如果它只发生在生产中(并且间歇性地发生),那就更难了,但我们通常发现我们的客户非常愿意接受调试式临时补丁,这样我们就可以收集信息来解决他们看到的问题。

简单记录的批处理文件的输出也是一个低风险的变化。一些调试代码的风险并不低,我们必须在涉及客户生产系统之前彻底测试 very 。有些人会拒绝一点空白,这是一个不明智的立场。

答案 1 :(得分:2)

在批处理脚本完成执行之前,您可能正在退出输入流代码。

后:

Process process = rt.exec(command);

你应该添加:

process.waitFor();

如果此 ,则可以通过故意减慢批处理脚本并检查是否遇到问题,在开发人员环境中验证它。尝试坚持这样的事情:

PING 1.1.1.1 -n 1 -w 5000 > NUL

进入批处理文件。它会暂停你的脚本5秒钟。