2012-04-05 12 views
1

Ich habe ein Problem beim Ausführen eines Befehls in Java mit dem Process Builder. In der Testmaschine funktioniert es korrekt, aber einmal auf dem Server friert der Prozess, der durch den Befehl geöffnet wird, ein und wird nie beendet. Dieser Code wird auf einem Apache Tomcat Windows Web Server verwendet:Prozess endet nie mit processBuilder

//WORD is the absolute path for msWord and inF is the absolute path 
//for the file to save as pdf 
public boolean changeFormatMSOffice(String inF, String WORD) { 
    System.out.println("changeFormatMSOffice(" + inF + "," + WORD + ")"); 
    String macro = ""; 
    ArrayList<String> wordArr = new ArrayList<String>(java.util.Arrays.asList(TO_PDF_WORD.replace(" ", "").split(","))); 
    ArrayList<String> excelArr = new ArrayList<String>(java.util.Arrays.asList(TO_PDF_EXCEL.replace(" ", "").split(","))); 
    ArrayList<String> ppArr = new ArrayList<String>(java.util.Arrays.asList(TO_PDF_PP.replace(" ", "").split(","))); 
    String extension = inF.substring(inF.lastIndexOf(".")).replace(".", "").trim(); 
    BufferedWriter out; 
    List<String> cmdList = new ArrayList<String>(); 
    cmdList.add(WORD); 
    String saveFile = ""; 
    if (wordArr.contains(extension)) { 
     macro = "/msaveAsPDF"; 
     cmdList.add(macro); 
     cmdList.add(inF); 
    } else if (excelArr.contains(extension) || ppArr.contains(extension)) { 
     if (excelArr.contains(extension)) { 
      macro = "/mSaveXLSAsPDF"; 
     } else { 
      macro = "/msavePPTAsPDF"; 
     } 
     cmdList.add(macro); 
     int fileNum = 0; 
     saveFile = "\"" + PATH + (PATH.substring(PATH.length() - 1).equals(File.separator) ? "" : File.separator) + fileNum + ".txt\""; 
     while (new File(saveFile).exists()) { 
      fileNum++; 
      saveFile = "\"" + PATH + (PATH.substring(PATH.length() - 1).equals(File.separator) ? "" : File.separator) + fileNum + ".txt\""; 
     } 
     try { 
      out = new BufferedWriter(new FileWriter(saveFile)); 
      out.write(inF); 
      out.close(); 
      cmdList.add(saveFile); 
     } catch (Exception e) { 
      System.err.println(e.toString()); 
     } 
    } 

    try { 
     ProcessBuilder proc = new ProcessBuilder(cmdList); 
     System.out.println("PreWaitForList"); 
     Process pro = proc.start(); //<----- important part starts here 
     StreamGobbler g1 = new StreamGobbler("stdin", pro.getInputStream()); 
     StreamGobbler g2 = new StreamGobbler("stderr", pro.getErrorStream()); 
     g1.start(); 
     g2.start(); 
     pro.waitFor();//<---- hangs here, but need to wait for it to exit(system requirement) 
     System.out.println("AfterWaitFor"); 
     try { 
      if (!saveFile.equals("")) { 
       new File(saveFile).delete(); 
      } 
     } catch (Exception e) { 
     } 
     return true; 
    } catch (Exception e) { 
     System.err.println(e.toString()); 
     return false; 
    } 
} 

i Informationen und sagen, dass Sie die std und Fehlerströme sonst wird es sammeln, müssen freze so habe ich die folgenden Stream Gobbler Umsetzung:

public class StreamGobbler implements Runnable { 

    String name; 
    InputStream is; 
    Thread thread; 

    public StreamGobbler(String name, InputStream is) { 
     this.name = name; 
     this.is = is; 
    } 

    public void start() { 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public void run() { 
     try { 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 

      while (true) { 
       String s = br.readLine(); 
       if (s == null) { 
        break; 
       } 
       System.out.println("[" + name + "] " + s); 
      } 

      is.close(); 

     } catch (Exception ex) { 
      System.out.println("Problem reading stream " + name + "... :" + ex); 
      ex.printStackTrace(); 
     } 
    } 
} 

beachten Sie, dass während des Befehl in der Befehlszeile ausgeführt es funktioniert, sowohl in der Testmaschine und in dem Server

+1

Sie könnten versuchen, zu schließen process.getOutputStream() – benmmurphy

Antwort

1

Sind die Umgebungsparameter (wie $ path) und das Arbeitsverzeichnis des gleiche, wenn Sie den Prozess ab Java gegen die Befehlszeile ?

+0

ja, ich hatte eine 'System.out.printLn ("\" "+ cmdList [0] +" \ "" + cmdList [1] + "\" "+ cmdList [2] + "\" "); ' um es zu drucken, und kopieren Sie einfach in den Cmd kopieren –

+0

Das sind nur die Befehlsargumente, nicht die Umgebungsvariablen – daveb

+0

die Befehlszeilenargumente sind absolute Pfade, es sei denn, ich missverstehen die Verwendung der Umgebungsvariablen ich benutze sie nicht, Auch der PATH, in meinem Code ist eine Konstante, um den Speicherort der Dateien zu referenzieren –

Verwandte Themen