Tenho um servlet que chama um script no unix através de uma url. Esse script executa alguns processos e retorna um resultado que dependendo da resposta o servlet envia o resultado pro cliente.
O problema:
o script as vezes demora um pouco, mas é executado, porém o servlet não espera a conclusão do script.
O servlet dá a resposta que deu erro, mas não deu! Ele não esperou a conclusão do script.
Alguém tem uma idéia de como eu faço o servlet esperar o script concluir seu processo? Uma vez que eu não tenho tempo fixo…
Dá para você modificar seu script para que ele retorne imediatamente e deixe o processo que você quer rodar em background? Aí esse processo, ao terminar, pode gravar um arquivo de controle ou alguma coisa.
No Unix é relativamente fácil deixar algo em background ("blablabla > saida.txt &" ou "nohup blablabla > saida.txt &" ) .
Você pode dividir sua página em duas: uma que simplesmente dispara o processo, e retorna ao cliente “A sua solicitação foi encaminhada, retorne aqui para ver se já foi processada” ou coisa parecida, e outra que checa se o processo já terminou (por exemplo, checando a existência do arquivo de controle).
Se você precisar mesmo esperar o script para ver que resposta ele dá, é possível ajustar o request time-out do web container. Mas aí a configuração varia de servidor pra servidor.
Dá. Como eu disse, a maioria dos servidores deixam você alterar quanto tempo esperar o servlet responder antes de dar um erro de timeout, mas onde configurar isso vai depender de qual servidor você está usando. De qualquer forma, se o script for demorar mais do que um ou dois minutos, a solução do thingol é melhor.