У меня есть класс, который управляет созданием 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)
ли я реализовать это неправильно? Я пропустил что-то важное? Любые идеи о том, как получить больше информации из процесса, были бы замечательными.
я застрял ....
+1 для связи. Это отличная ссылка, и я уже дважды читал ее спереди назад. Это было полезно, но не очень помогло. Я также добавил proc.getOutputStream(), но все равно не повезло. – northpole
См. Мой отредактированный ответ; вам также нужно нажать proc.getErrorStream(). Предпочтительно в их собственных отдельных нитях. – BlairHippo