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…