Executar linha de comando no prompt através do Java
Criei uma classe que executa uma linha de comando para fazer uma exportação de base de dados do Oracle no prompt do DOS. Ele está funicionando mais queria que gerasse uma messagem no prompt quando o backup fosse finalizado com sucesso tipo System.out.println(“Backup finalizado com sucesso.”)
***********************O Programa*************************
import java.io.*;
/**
*
* @author mns
*/
public class BkOracle {
/** Creates a new instance of BkOracle */
public BkOracle() {
}
private static void FazBackup() {
String bkdbdoc = "exp system/123456@dbdoc file=C:\\temp\\dbdoc.dmp log=C:\\temp\\dbdoc.log direct=y consistent=y";
try {
Runtime.getRuntime().exec("cmd /c "+bkdbdoc);
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
BkOracle.FazBackup();
}
}Mauricio Souza
Curtidas 0
Respostas
Anderson Wagner
09/04/2009
mas é isso mesmo
coloque o
System.out.println(“Backup finalizado com sucesso.”)
no final do "FazBackup"
ou depois da chamada dele no main ai depende de você
GOSTEI 0
Jeferson Mayer
09/04/2009
[quote="anderson.wagner"]mas é isso mesmo
coloque o
System.out.println(“Backup finalizado com sucesso.”)
Negativo. O método [b]exec()[/b] irá iniciar um processo separado, então não adianta só fazer isso.
A solução seria obter a instância de [b]Process[/b] retornada pelo método [b]exec()[/b] e chamar [b]waitFor()[/b].
Algo como (mais ou menos pseudo-código):
public class BackupOracle {
private static Process start() {
try {
return Runtime.getRuntime().exec("nao-sei-o-que");
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
Process process = start();
process.waitFor();
System.out.println("Fim");
}
}
GOSTEI 0
Mauricio Souza
09/04/2009
jackinabox,
Fiz o que vc falou. Quando boto pra executar um comando simples do oracle para testar a conexao "tnsping dbdoc" funciona, mas quendo coloco um comando pra gerar uma exportaçao como "exp system/******@dbdoc file=dbdoc.dmp log=dbdoc.log direct=y consistent=y" o precesso fica em execucao e dá impressao que travou...e só gera o arquivo de backup e de log quando aborto o processo. Tem alugma coisa que possa facilitar a finalização deste processo?
GOSTEI 0
Jeferson Mayer
09/04/2009
[quote="Morys"]jackinabox,
Quando boto pra executar um comando simples do oracle para testar a conexao "tnsping dbdoc" funciona, mas quendo coloco um comando pra gerar uma exportaçao como [...] o precesso fica em execucao e dá impressao que travou...e só gera o arquivo de backup e de log quando aborto o processo.
Bem, essas coisas às vezes são complicadas... A própria documentação de [b]Process[/b] diz que "Os métodos [b]Runtime.exec[/b] podem não funcionar bem para processos especiais em certas plataformas nativas..."
Diz também que "não é requerido que o processo execute assincronamente ou concorrentemente em relação ao processo Java que o iniciou".
Ou seja, o comportamento não é garantido.
A única idéia que me vem à mente é de que o processo iniciado esteja entupindo ao escrever em [b]stdout[/b] (e/ou [b]stderr[/b]). Nesse caso, você poderia tentar redirecionar as streams padrão do processo na linha de comando, ou capturar essas streams no seu programa Java utilizando [b]Process.getOutputStream()[/b] e [b]Process.getErrorStream()[/b], e ficar monitorando essas streams. Pelo menos por curiosidade, eu faria isso.
Mas, se eu estivesse mais preocupado em "fazer o que deve ser feito", eu faria funcionar através da mais sofisticada comunicação entre processos já inventada: trocas de mensagens através de arquivos, hahaha...! Quando o processo terminar, grava um arquivo. O programa Java fica monitorando e quando o arquivo estiver lá, é porque terminou.
Uma $#%@!, mas deve funcionar...
GOSTEI 0
Mauricio Souza
09/04/2009
Valeu pelas dicas. Mas acho que vou deixar como está, não vou usar o process, afinal o comando de exportaçao do Oracle gera um log e ali saberei se o programa teve sucesso ou não.
GOSTEI 0
Roberto Almada
09/04/2009
Cara, se eu fosse você salvaria um arquivo .bat (ou .cmd) através do FileWrite com os cmds desejados, e pra executa-lo é só usar o método Runtime.getRuntime().exec(explorer CAMINHO ATE O BAT);
Nao é a maneira mais 'sofisticada', mas funciona muito bem, e até IDEs usam metodos parecidos, basta inserir no proprio .bat um comando para deletar a si mesmo e todos os arquivos 'temporarios' que precisara escrever com o FileWriter para esse processo funcionar (ERASE arquivos..).
Ja fiz isso para fazer um 'depurador' em um programa de escrever arquivos e deu certo. Se nao quiser que fique abrindo o prompt, basta mudar o OutPut do sistema para uma jTextArea...
GOSTEI 0
Welington Garcia
09/04/2009
Assistam as vídeo aulas no canal JAVA PLUGADOS e aprendam a programar desde o básico até o avançado de maneira fácil e pratica!
https://www.youtube.com/channel/UC_8SElusYdENzVw1Fsk0Nbg
GOSTEI 0
Gabriel Simas
09/04/2009
Vamos simplificar as coisas. você pode colocar este método como boolean e aí tratá-lo na Main, veja o exemplo abaixo:
No que precisar, pode recorrer ao fórum.
Forte Abraço
:amigos:
import java.io.*;
/**
*
* @author mns
*/
public class BkOracle {
/** Creates a new instance of BkOracle */
public BkOracle() {
}
private static bool FazBackup() {
String bkdbdoc = "exp system/123456@dbdoc file=C:\temp\dbdoc.dmp log=C:\temp\dbdoc.log direct=y consistent=y";
try {
Runtime.getRuntime().exec("cmd /c "+bkdbdoc);
return true;
} catch (IOException ex) {
ex.printStackTrace();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
if (BkOracle.FazBackup()) {
System.out.println(“Backup finalizado com sucesso.”);
} else {
System.out.println(“Deu Xabuuuu”);
}
}
}
GOSTEI 0