【问题标题】:Java Process hangs during stdInput readingJava 进程在 stdInput 读取期间挂起
【发布时间】:2016-01-21 14:45:42
【问题描述】:

我在尝试启动执行 EXPDP 命令以备份 Oracle DB 的进程时遇到问题。

这是启动进程的方法,问题是当我尝试从 stInput 和 stdError 读取时。该进程永远挂起,如果我停止调试以查看运行时执行的位置,我得到的行是:

FileInputStream.readBytes(byte[], int, int) line: not available [native method] 

在方法入口点,cmdCommand 参数的值为:

"EXPDP system/syspwd@orcl DIRECTORY=DATA_PUMP_DIR SCHEMAS=fabro DUMPFILE=backupFabro.dmp LOGFILE=backupFabro.log"

方法如下,挂在第一个while循环上。

 public Boolean cmdCommand(String cmdCommand) throws IOException{
            logger.info("**************************************");
            logger.info("Esecuzione comando:");
            logger.info(cmdCommand);
            logger.info("**************************************");
            final Process p = Runtime.getRuntime().exec(cmdCommand);
            Boolean end = false;
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            String line = null; 
            try {
                while ((line = stdInput.readLine()) != null) {
                    logger.info(line);
                }
                while((line= stdError.readLine()) != null){
                    logger.error(line);
                }
            } catch (IOException e) {
                logger.error(e.getMessage(), e);
            }
            finally{
                stdError.close();
                stdInput.close();
            }
            try {
                if(p.waitFor() != 0){                       
                    logger.error("error etc etc");
                }
                else{
                    end = true;
                    logger.info("success ecc ecc");
                }
            } catch (Exception e) {
                logger.error(e.getMessage(), e);
                p.destroy();
            }
            return end;
        }

【问题讨论】:

    标签: java oracle concurrency process expdp


    【解决方案1】:

    尝试使用 .ready() 函数。

    try {
          if (stdError.ready()) 
          {
                while((line= stdError.readLine()) != null){
                    logger.error(line);
                }
          }
    }
    

    对标准输出做同样的事情。

    它对我来说就像一个魅力。

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多