2009-05-06 2 views
1

У меня есть класс, который управляет созданием RTF-документов и методом в этом классе, который вызывает RTF-редактор с XML-файлом для отображения.Runtime exec и настраиваемый RTF-редактор

Все, кроме одного пользователя, могут получить доступ к этому редактору без каких-либо проблем. Этот один пользователь постоянно сталкивается с проблемой, когда их приложение просто зависает. В каких-либо журналах ошибок нет. Обычно эта проблема легко идентифицируется, воспроизводится и исправляется, однако я не могу на всю жизнь воспроизвести ее, чтобы мои попытки отладки не сработали.

В основном код выглядит следующим образом:

int exitVal = CUBSRTFEditor.runRTFEditor("c:\\tmp\\control"+ap_doc_id+".xml", xml,"I:\\AppealsLetters.exe /process \"c:\\tmp\\control"+ap_doc_id+".xml\""); 

public static int runRTFEditor(String xmlLocation, String xmlContent, String executePath) 
{ 
    int exitVal = 0; 
    createLocalFile(xmlLocation, xmlContent); 

    try 
    { 
     System.out.println("executePath must = "+executePath); 
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(executePath); 
     System.out.println("after executePath runs"); 

     //exhaust that stream before waiting for the process to exit 
     InputStream inputstream = proc.getInputStream(); 
     InputStreamReader inputstreamreader = new InputStreamReader(inputstream); 
     BufferedReader bufferedreader = new BufferedReader(inputstreamreader); 
     // read the ls output 
     String line; 
     while ((line = bufferedreader.readLine())!= null) 
     { 
      System.out.println(line); 
     } 
     exitVal = proc.waitFor(); 
    } 
    catch (Throwable t) 
    { 
     t.printStackTrace(); 
    } 

    CUBSRTFEditor.deleteTempFile(xmlLocation); 

    return exitVal; 
} 

Последний выход является первым System.out. Когда я беру файл xml и выполняю его на любом другом ПК, он выполняется без проблем. Я не вижу никакой полезной информации в proc.getErrorStream() или proc.getOutputStream().

Javadoc В документации JDK по этой проблеме (EXEC висящего): Поскольку некоторые местные платформы только обеспечивают ограниченный размер буфера для стандартных входных и выходных потоков, отказ оперативно записать входной поток или читать выходной поток подпроцесса может вызывают подпроцесс блокировки и даже тупик.

Стараюсь исчерпать этот поток не дожидаясь процесса, чтобы выйти и что, кажется, не помогает, как это кажется, никогда не добраться до этой точки (не отображается второй System.out)

ли я реализовать это неправильно? Я пропустил что-то важное? Любые идеи о том, как получить больше информации из процесса, были бы замечательными.

я застрял ....

ответ

2

Runtime.exec() обманчиво малоприятная окучивать работать. Я нашел this article (старый, но по-прежнему актуальный), чтобы быть весьма полезным. Вы можете всегда пропустить страницу для некоторого кода с высокой степенью gankable. :-)

С первого взгляда ваш код должен обрабатывать как proc.getOutputStream(), так и proc.getErrorStream(), что является хорошей причиной для обработки этих потоков в отдельных потоках.

+0

+1 для связи. Это отличная ссылка, и я уже дважды читал ее спереди назад. Это было полезно, но не очень помогло. Я также добавил proc.getOutputStream(), но все равно не повезло. – northpole

+0

См. Мой отредактированный ответ; вам также нужно нажать proc.getErrorStream(). Предпочтительно в их собственных отдельных нитях. – BlairHippo

0

Я хотел обновить это, потому что смена началась в «Производство сегодня» и сработала. Основываясь на предложениях BlairHippo, я получил его для работы с анонимным внутренним классом, чтобы создать отдельный поток для исчерпания потоков ошибок и ввода.

new Thread(new Runnable(){ 
    public void run() 
    { 
     try 
     { 
      BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
      String line; 
      while ((line = br.readLine())!= null) 
      { 
       System.out.println(line); 
      } 
     } 
     catch (Throwable t) 
     { 
      t.printStackTrace(); 
     } 
    } 
}).start(); 
Смежные вопросы