[RESOLVIDO]Rodar .exe pelo java e verificar status

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.

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

Tem certeza que o executável está retornando zero ao fazer o backup com sucesso?

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?

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.

segue o meu bat de backup BD

[code]@echo off

… FAZ O QUE TEM DE FAZER

exit

echo.[/code]

no caso o exit é que faz o retorno?

Não sei… não manjo nada de BAT.

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?

[quote=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?[/quote]
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?

Encontrei na internet o seguinte codigo

[code]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);
    }[/code]

// 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

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).

ok depois vou testar com o wait for, obrigado.

opa perfeito alias o while que estava fazendo na mao deve ser o que esse metodo WaitFor faz por traz :smiley:

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

public synchronized int waitFor() throws InterruptedException {
    while (!hasExited) {
        wait();
    }
    return exitcode;
}