[RESOLVIDO]Rodar .exe pelo java e verificar status
13 respostas
furacao123
Aew galera fiz um .bat e transformei em .exe para fazer backup do BD Postgres
agora fiço o java chamar esse .exe para gerar o backup do banco, mas estou tentando tratar a execução pra saber se deu algum problema mas nao esta dando certo
private void gerarBackupSaida() {
if (Constantes.IS_BKP_AUTO_SAIR) {
try {
Process p = Runtime.getRuntime().exec(Constantes.URL_EXE_BACKUP);
if (p.exitValue() == 0) {
JOptionPane.showMessageDialog(view, "Backup gerado com sucesso!");
} else {
JOptionPane.showMessageDialog(view, "Falha ao gerar backup!\nCaminho: "+Constantes.URL_EXE_BACKUP);
}
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(view, "Falha ao gerar backup!\nCaminho: "+Constantes.URL_EXE_BACKUP+"\n Erro: "+ e.getMessage());
} finally {
System.exit(0);
}
} else {
System.exit(0);
}
}
ele retorna 1 em p.exitValue(), mas o backup é gerado certinho, eu quero fechar a aplicação assim que terminar de fazer o backup e nao antes como resolvo esse problema?
E existe outra maneira de fazer backup do postgres diretamente do java?
Furacao, bom dia
Seguinte, não entendi muito bem o erro, pois você diz que o backup é gerado corretamente… Tipo me parece que o único problema é de fato mudar a condição do if para == 1 …
Que mensagem de erro que aparece no JOptionPane?
att.
Estevan Costa
M
marcobiscaro2112
Tem certeza que o executável está retornando zero ao fazer o backup com sucesso?
furacao123
sim o backup gera normal o estranho é o retorno 1 se executou normalmente nao deveria retornar 0?
Como funciona essa classe Process, como ela valida o status da execucao do .exe?
M
marcobiscaro2112
Ele usa o código de retorno do executável. Em C, seria algo como:
intmain()
{
return0;
}
Em shell script:
#!/bin/bashexit0
A questão é: você retorna um valor explicitamente do seu .bat? Talvez seja isso o que falte.
furacao123
segue o meu bat de backup BD
@echooff...FAZOQUETEMDEFAZERexitecho.
no caso o exit é que faz o retorno?
M
marcobiscaro2112
Não sei… não manjo nada de BAT.
furacao123
mas quando eu chamo um exe pelo java ele roda o executavel por fora certo?
eu posso continuar usando a aplicação em java enquanto o exe é executado multitarefa?
M
marcobiscaro2112
furacao123:
mas quando eu chamo um exe pelo java ele roda o executavel por fora certo?
eu posso continuar usando a aplicação em java enquanto o exe é executado multitarefa?
Pode. Só cuidado para não encerrar o processo da JVM antes de terminar o backup pois pode dar problema.
Uma coisa: você já tentou usar waitFor() no lugar de exitValue() no seu código?
furacao123
Encontrei na internet o seguinte codigo
if(Constantes.IS_BKP_AUTO_SAIR){try{Processp=Runtime.getRuntime().exec(Constantes.URL_EXE_BACKUP);// le o retornoScannerretorno=newScanner(p.getInputStream());while(retorno.hasNextLine()){System.out.println(retorno.nextLine());}if(p.exitValue()==0){JOptionPane.showMessageDialog(view,"Backup gerado com sucesso!");}else{JOptionPane.showMessageDialog(view,"Falha ao gerar backup!\nCaminho: "+Constantes.URL_EXE_BACKUP);}}catch(Exceptione){e.printStackTrace();JOptionPane.showMessageDialog(view,"Falha ao gerar backup!\nCaminho: "+Constantes.URL_EXE_BACKUP+"\n Erro: "+e.getMessage());}finally{System.exit(0);}}else{System.exit(0);}
// le o retornoScannerretorno=newScanner(p.getInputStream());while(retorno.hasNextLine()){System.out.println(retorno.nextLine());}
e funcionou agora retornou 0 e gerou a mensagem Backup gerado com sucesso
mas nao entendi o que foi feito aqui para funcionar
M
marcobiscaro2112
O Scanner lê a saída do processo (portanto, o seu programa é obrigado a esperar que o backup termine para sair desse while).
Provavelmente, o que estava acontecendo é que você tentava acessar o exitCode antes do processo terminar de executar.
Por isso sugeri que você tentasse o waitFor (que aguarda o final do processo e retorna o código de saída).
furacao123
ok depois vou testar com o wait for, obrigado.
furacao123
opa perfeito alias o while que estava fazendo na mao deve ser o que esse metodo WaitFor faz por traz