Launching wkhtmltopdf from Runtime.getRuntime (). Exec (): nunca termina?

Estou iniciando o wkhtmltopdf a partir do meu aplicativo Java (parte de um servidor Tomcat, executando no modo de depuração no Eclipse Helios no Win7 de 64 bits): Gostaria de aguardar a conclusão e, em seguida, fazer mais coisas.

String cmd[] = {"wkhtmltopdf", htmlPathIn, pdfPathOut};
Process proc = Runtime.getRuntime().exec( cmd, null );

proc.waitFor();

MaswaitFor() nunca retorna. Ainda consigo ver o processo no Gerenciador de tarefas do Windows (com a linha de comando que passei para exec (): parece bem). E FUNCIONA. wkhtmltopdf produz o PDF que eu esperaria, exatamente onde eu esperaria. Posso abri-lo, renomeá-lo, o que for, mesmo enquanto o processo ainda estiver em execução (antes de finalizá-lo manualmente

Na linha de comando, está tudo bem:

c:\wrk>wkhtmltopdf C:\Temp\foo.html c:\wrk\foo.pdf
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done

O processo termina muito bem e a vida continua.

Então, o que é issoruntime.exec() que está causando o wkhtmltopdf para nunca terminar?

Eu poderia pegar proc.getInputStream () e procurar por "Done", mas isso é ... vil. Quero algo que seja mais geral.

Chamei exec () com e sem um diretório ativo. Eu tentei com e sem uma matriz "env" vazia. Sem alegria.

Por que meu processo está interrompido e o que posso fazer para corrigi-lo?

PS: Eu tentei isso com alguns outros aplicativos de linha de comando e ambos exibem o mesmo comportament

ais problemas do executiv

Estou tentando ler o erro padrão, sem sucesso. Na linha de comando, eu sei que deveria haver algo extraordinariamente semelhante à minha experiência na linha de comando, mas quando leio o fluxo de entrada retornado por proc.getInputStream (), recebo imediatamente um EOL (-1, estou usandoinputStream.read()).

Verifiquei o JavaDoc for Process e encontrei este

O processo pai usa esses fluxos para alimentar a entrada e obter a saída do subprocesso. Como algumas plataformas nativas fornecem apenas tamanho de buffer limitado para fluxos de entrada e saída padrão, a falha na gravação imediata do fluxo de entrada ou na leitura do fluxo de saída do subprocesso pode fazer com que o subprocesso [b] bloqueie e até com um impasse [/ b].

Enfase adicionada. Então eu tentei isso. O primeiro 'read ()' no inputStream de saída padrão foi bloqueado até eu interromper o processo ...

WITH WKHTMLTOPDF

Com a linha de comando genérica ap & sem parâmetros, para que "despeje o uso e finalize", ele suga o std :: out apropriado e finaliz

Interessante

roblema na versão @JVM? Estou usando 1.6.0_23. O mais recente é ... v24. Acabei de verificar o log de alterações e não vejo nada promissor, mas vou tentar atualizar de qualquer maneir

OK. Não deixe que os fluxos de entrada sejam preenchidos ou eles serão bloqueados. Verifica..close() @ também pode impedir isso, mas não é muito brilhant

sso funciona em geral (incluindo os aplicativos genéricos de linha de comando que testei

Especificament no entanto, cai. Parece que o wkhtmltopdf está usando alguma manipulação de terminal / material do cursor para fazer uma barra de progresso gráfica ASCII. Acredito que isso esteja fazendo com que o inputStream retorne imediatamente o EOF em vez de fornecer os valores correto

Alguma ideia? Dificilmente um negócio, mas com certeza seria bom ter.

questionAnswers(4)

yourAnswerToTheQuestion