[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?

Obrigado.

13 Respostas

E

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

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

Ele usa o código de retorno do executável. Em C, seria algo como:

int main()
{
    return 0;
}

Em shell script:

#!/bin/bash
exit 0

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

@echo off

... FAZ O QUE TEM DE FAZER

exit

echo.

no caso o exit é que faz o retorno?

M

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

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 {
                Process p = Runtime.getRuntime().exec(Constantes.URL_EXE_BACKUP);

                // le o retorno
                Scanner retorno = new Scanner(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 (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);
        }
// le o retorno
                Scanner retorno = new Scanner(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

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 :smiley:

M

Sim. Segue o código do método waitFor:

public synchronized int waitFor() throws InterruptedException {
    while (!hasExited) {
        wait();
    }
    return exitcode;
}
Criado 28 de dezembro de 2010
Ultima resposta 29 de dez. de 2010
Respostas 13
Participantes 3