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.