java exec oracle exp command

Tags:    java

Hej er der nogle kloge hoveder... Der kan hjælpe med hvordan man laver et java program der kan kalde Oracles exp kommando og opsamle stdout....
Oralce exp kommando er på True64...

Her er mit kode pt... Men der får jeg ikke feedback tilbage på den process jeg lytter på...
Kommandoen exp bliver udført dog.... Nogle forslag???


public class CmdExec {
public CmdExec(String cmdline) {
try {
String line;
Process p = Runtime.getRuntime().exec(cmdline);
BufferedReader input =
new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
StatusTxt.append(line+"\\n");
System.out.println(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}

private void RunBtn_actionPerformed(ActionEvent e) {
new CmdExec("exp cdb/cdb@quest7 file=/Backup/calzone.dmp STATISTICS=none owner=cdb");
}



5 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Hej er der nogle kloge hoveder... Der kan hjælpe med hvordan man laver et java program der kan kalde Oracles exp kommando og opsamle stdout....
Oralce exp kommando er på True64...

Her er mit kode pt... Men der får jeg ikke feedback tilbage på den process jeg lytter på...
Kommandoen exp bliver udført dog.... Nogle forslag???


public class CmdExec {
public CmdExec(String cmdline) {
try {
String line;
Process p = Runtime.getRuntime().exec(cmdline);
BufferedReader input =
new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
StatusTxt.append(line+"\\n");
System.out.println(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}

private void RunBtn_actionPerformed(ActionEvent e) {
new CmdExec("exp cdb/cdb@quest7 file=/Backup/calzone.dmp STATISTICS=none owner=cdb");
}


Jeg kan ikke lige finde en reference til StatusTxt klassen...

...men prøv evt. at lytte til stderror (<Process>.getErrorStream()) og kontroller evt. exitValue()




Hej,

jeg har bikset en smule kode sammen, der udfører en kommando og lytter efter output :

Fold kodeboks ind/udKode 


MvH

Stefan Svensson
http://fusket.frac.dk



Jamen det virker jo tildels.... Som det skriv jeg selv havde, så bliver der startet en process, som bliveer kørt ok.... Men der kommer ikke noget feedback på dette????
Problemet er nok noget med at "exp" ikke sender feedback tilbage der hvor jeg kigger????
Hvis jeg laver noget andet ex. "java -version" så kommer svaret...
Hvis jeg starter min "exp" kommando i min shell så kommer der alt det feedback som jeg mangler.

Så mit problem er at jeg ikke kan fange det feedback, som jeg ved kommer.. og jeg ved at koden køre ok....
Med hensyn til "StatusTxt" så er det bare en jTextArea i min gui...




Glem det, jeg måtte læse lidt op omkring det.... Hvis nogen skulle have intresse...
Det der skulle til er at man er nødt til at start en thread med processen og så en anden thread til at lytte med.... sådan cirka
public class RunCmd {
public RunCmd(String cmd) {
Runtime runtime = Runtime.getRuntime();
StringBuffer sb = new StringBuffer();
try {
final Process p = runtime.exec(cmd);
InputStream is = p.getInputStream();
InputStream err = p.getInputStream();
new Thread(new Runnable() {
public void run() {
try {
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getInputStream()),5000);
String a = "";
while (( a = in.readLine()) != null) {

try{Thread.sleep(50);} catch(InterruptedException ie) {System.out.println(ie);}
}
in.close();
}
catch (IOException ioe) {System.out.println(ioe);}
}
}).start();

new Thread(new Runnable() {
public void run() {
try {
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getErrorStream()),5000);
String a = "";
while (( a = in.readLine()) != null) {
//System.out.println("read: " + a);
StatusTxt.append(a+"\\n");
try{Thread.sleep(50);}catch(InterruptedException ie) {System.out.println(ie);}
}
in.close();
}
catch (IOException ioe) {System.out.println(ioe);}
}
}).start();
}
catch (IOException ioee) {System.out.println(ioee);}
}
}



Fold kodeboks ind/udKode 


Det er ikke nødvendigt, at oprette 2 nye tråde til at læse outputtet fra din nye process. Grunden til, at dit oprindelige program ikke fik fat på processens feedback skyldtes sandsynligvis, at dit program enten når forbi dit while ((line = in.readLine()) != null) statement inden den nye process når at returnere noget feedback (kan skyldtes maskinens schedulerings strategi) eller også lyttede du på den forkerte strøm (InputStream vs. ErrorStream).

Derfor kan du enten indbygge en forsinkelse, i stil med den ovenstående via. Thread.sleep(x), i dit program så processen når at producere feedback. Tilsvarende skal man også sikre sig, at feedback strømmen ikke når at løbe tør informationer før processen rent faktisk er slut.

Du kan også bruge BufferedReader klassen til at opsamle alt feedback fra processen (i stil med ovenstående) og så bede dit program om at vente indtil processen afsluttes via. <Process>.waitFor().

Men eftersom JVM allerede afvikler koden i main metoden i en tråd er der ingen grund til at oprette 2 nye. Tommelfingerreglen for multithreading er, at medmindre du har en rigtig god grund til at oprette en ny tråd så lad være :o)

Der er sikkert en pænere måde at gøre det på, men mon ikke nedenstående fungerer?

(Det er ikke testet)

Fold kodeboks ind/udKode 





t