문제

RTF 문서 작성을 관리하는 클래스와 해당 클래스의 메소드가 XML 파일을 표시하여 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;
}

마지막 출력은 첫 번째 시스템입니다. XML 파일을 가져 와서 다른 PC에서 실행하면 문제없이 실행됩니다. proc.geterrorstream () 또는 proc.getoutputStream ()에 유용한 정보가 표시되지 않습니다.

이 문제에 대한 JDK의 Javadoc 문서 (Exec Hanging) :일부 기본 플랫폼은 표준 입력 및 출력 스트림에 대한 제한된 버퍼 크기만을 제공하기 때문에 입력 스트림을 즉시 작성하거나 하위 프로세스의 출력 스트림을 읽지 않으면 서브 프로세스가 차단되고 교착 상태가 될 수 있습니다.

나는 프로세스가 종료되기를 기다리기 전에 그 스트림을 소진 시키려고 노력하고 있으며, 그것은 그 시점에 도달하지 못하는 것처럼 보이지 않는 것 같습니다 (두 번째 System.out는 표시되지 않음).

이것을 잘못 구현 했습니까? 내가 중요한 것을 놓치고 있습니까? 프로세스에서 더 많은 정보를 얻는 방법에 대한 아이디어는 좋을 것입니다.

나는 붙어있다 ....

도움이 되었습니까?

해결책

runtime.exec ()는 함께 일할 수있는 기만적으로 불쾌한 작은 스퍼드입니다. 나는 찾았다 이 기사 (오래되었지만 여전히 관련이 있음) 매우 도움이됩니다. 당신은 항상 4 페이지로 건너 뛸 수 있습니다. :-)

한눈에, 코드는 Proc.GetOutputStream () 및 Proc.GetErrorstream ()을 모두 처리해야하며, 이는 별도의 스레드에서 해당 스트림을 처리 해야하는 좋은 이유입니다.

다른 팁

변화가 오늘 생산에 들어가서 효과가 있었기 때문에 이것을 업데이트하고 싶었습니다. 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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top