Process e getInputStream (Backup banco Mysql através de processo)

0 respostas
A

Olá a todos.
Estou trabalhando no desenvolvimento de uma rotina de backup de banco de dados MySql.
Não tenho muita experiência no assunto, então li bastante na internet nos fóruns aqui disponíveis e consegui chegar a essa função.

Estava gerando anteriormente um arquivo bat (criando o arquivo e chamando o mesmo para execução) porém achei não muito elegante, ficar criando o arquivo bat em tempo de execução e depois ter que chama-lo.

Com isso decidi criar um processo Process pegando o Runtime e executando o comando desejado:
Já tentei o mesmo com o ProcessBuilder e acabei tendo o mesmo problema.

public String back(String dirExecuta, String dirSalva){
        /* São passados os diretórios de origem e destino, o \\backup\\mysqldump está na mesma pasta de execução do arquivo jar com isso ao configurar a aplicação é criado o diretorio backup\ e colocado o arquivo mysqldump.exe nele */

        String comando =  dirExecuta + "\\backup\\mysqldump.exe -v -v -v --host=servidor --user=usuario --password=senha --port=3306 --protocol=tcp --force --allow-keywords --compress --add-drop-table --hex-blob --result-file="+
                dirSalva.replace("\\", "/") + "/backup_X DATABASE_NAME";

        String retorno = null; //Essa String deverá armazenar a linha de leitura do BufferedReader
        StringBuffer temp = new StringBuffer(); //Essa String irá armazenar todo o conteudo do buffered
       
        try {
            
            Process proc = Runtime.getRuntime().exec(comando); //Cria o processo com o comando especificado
            InputStream in = proc.getInputStream(); //Captura o inputStream
            OutputStream out = proc.getOutputStream(); //Aqui estou tentando capturar o Output não sei se é realmente necessário.
            InputStream err = proc.getErrorStream(); //Idem questão anterior não sei a real necessidade
            BufferedReader br = new BufferedReader(new InputStreamReader(in)); //Armazenando em buffer a execução

            while((retorno = br.readLine()) != null){//Faz a leitura do buffer
                temp.append(retorno + "\r\n");
            }
            proc.waitFor();
            proc.destroy();
            in.close();
            out.close();
            err.close();
            br.close();
            
        } catch (IOException ex) {
            System.out.print(ex);
        } catch ( InterruptedException MensagemdeErro ){
            System.out.println(MensagemdeErro);
        }

        return temp.toString();
    }

Bom vamos ao problema.

Quando executo a função, o sistema acaba congelando, ou seja, ele somente termina o processo “acompanhei no Gerenciador tarefas” quando encerrada a aplicação “dando um stop no netBeans”.

Acredito que o problema seja para pegar o retorno do processo. Pois quero armazenar a instrução do backup mysqldump para no final saber se foi concluído ou não com sucesso.

Caso eu remova o armazenamento do retorno do processo em buffer a aplicação cria o processo porém o mesmo não é destruido enquanto não fechar o aplicativo.

Se tiverem alguma sugestão agradeço…

Obrigado…

Criado 16 de março de 2009
Respostas 0
Participantes 1