Pergunta

Eu tenho uma classe que gerencia a criação de documentos RTF e um método em que a classe que chama o editor RTF com um arquivo XML para exibição.

Todos, mas um usuário pode acessar este editor sem quaisquer problemas. Este usuário corre-se consistentemente em um problema onde a sua aplicação apenas a trava. Não há erros em qualquer logs. Normalmente este tipo de problema é facilmente identificado, reproduzidos e corrigidos, no entanto, eu não posso para a vida de minha reproduzi-lo assim que minhas tentativas de depuração estão falhando.

Basicamente, o código é a seguinte:

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;
}

A última saída é o primeiro System.out. Quando eu tomar o arquivo xml e executar isso em qualquer outro PC que executa sem problema. Eu não vejo nenhuma informação útil no proc.getErrorStream () ou proc.getOutputStream ().

documentação Javadoc do JDK sobre este problema (enforcamento exec): Como algumas plataformas nativas só fornecem tamanho do buffer limitado para fluxos de entrada e saída padrão, a não prontamente escrever o fluxo de entrada ou ler o fluxo do subprocesso de saída pode causar a sub-processo para o bloco, e até mesmo impasse.

Eu tento esgotar esse fluxo antes de aguardar o processo para sair e que não parece ajuda, pois nunca parece chegar a esse ponto (o segundo System.out não é exibido)

Tem implementei isso incorretamente? Estou faltando alguma coisa importante? Algumas ideias sobre como obter mais informações fora do processo seria ótimo.

Eu estou preso ....

Foi útil?

Solução

Runtime.exec () é um pouco spud enganosamente desagradável para trabalhar. Eu encontrei este artigo (idade, mas ainda relevante) para ser bastante útil. Você sempre pode pular para a página 4 para um código de exemplo altamente gankable. : -)

À primeira vista, as suas necessidades de código para lidar com ambos proc.getOutputStream () e proc.getErrorStream (), que é uma boa razão para lidar com os fluxos em segmentos separados.

Outras dicas

Eu queria atualizar isso porque a mudança entrou em produção hoje e funcionou. Baseado fora das sugestões de BlairHippo eu tenho que trabalhar com uma classe interna anônima para criar um segmento separado para esgotar tanto o erro e fluxos de entrada.

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top