Newsgroup: it.comp.java
Titolo: Runtime.exec

Ciao a tutti 
ho un problemone con il Runtime.exec all'interno di una Action class di
struts.
Devo lanciare un processo di import e lanciando il comando da DOS funziona
bene, ma usando Runtime.getRuntime().exec(cmd) non va, nel senso che mi
rimane la pagina appesa nel caso in cui uso process.waitFor() o altrimenti
mi esegue solo parte del processo.
Il comando viene lanciato con > logfile.txt quindi loggando e sia nel
primo che nel secondo caso il log è come se restasse a metà.
Ho provato a mettere il tutto in un'altra classe "extends Thread" ma nada.
Ho provato a eseguire il tutto compilando la classe e lanciandola tramite
java.exe dal prompt e miracolosamente funziona.
C'è qualche limitazione dovuta al fatto che sono all'interno di una Action?
Come posso risolvere il problema?
NB. Il processo in questione è comunque un'altro applicativo Java lanciato
come cmd /c java.exe ecc..
Grazie
-- 
Pace
Doctor $.
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 primo che nel secondo caso il log è come se restasse a metà.
http://groups.google.com/group/it.comp.java/msg/4a9bdff43e843f15
--
Marco

 Marco
E' un baco?
Come posso gestire stdout/stderr?
Il problema ce l'ho solo all'interno dell'Action class....
se compilo e lancio da dos java.exe mi va perfettamente


 se compilo e lancio da dos java.exe mi va perfettamente
Inoltre a parte il log , il processo resta appeso (questo mi fa pensare
che lo stdout non centri nulla). Al di là di dove sia l'output... non c'è
output!


 Marco
Anche così mi resta appesa la pagina....
Process myproc = Runtime.getRuntime().exec(cmd);
InputStream in = myproc.getInputStream();
int c; 
StringBuffer temp = new StringBuffer(); 
try { 
      while((c=in.read()) != -1) 
      temp.append((char) c); 
    } 
catch(IOException ex) {} 
Help!


 InputStream in = myproc.getInputStream();
succhia anche l'error stream

 succhia anche l'error stream
ok ci siamo quasi....
ho sostituito con 
InputStream in = myproc.getErrorStream();
mi da:
java.lang.UnsatisfiedLinkError: no xadlang in java.library.path
qual'è il problema?
il class path mi sembra corretto c:\..\lib
c'è un file xadlang.dll in c:\..\bin è perchè non lo vede da dov'è?
come risolvo?


 c'è un file xadlang.dll in c:\..\bin è perchè non lo vede da dov'è?
java.library.path != classpath
metti la dll in una delle directory specificate nel library path oppure
aggiungi al library path la directory che vuoi.
System.getProperty("java.library.path");
System.setProperty("java.library.path", valore che vuoi);
segue codice di una possibile exec:
public static boolean execCommand(String cmd, boolean printConsoleOutput)
    {
        Runtime r = Runtime.getRuntime();
        Process p;
        try {
            p = r.exec(cmd);
            p.getOutputStream().close();
            final BufferedReader bri = new BufferedReader(new
InputStreamReader(p.getInputStream()));
            final BufferedReader bre = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
            Thread thro = new Thread(new Runnable(){
                public void run() {
                    try {
                        String buf;
                        while((buf = bri.readLine()) != null) {
                            System.out.println(buf + "\n");
                        }
                    } catch (IOException ex) {
                    }
                }
            });
            thro.start();
            Thread thre = new Thread(new Runnable(){
                public void run() {
                    try {
                        String buf;
                        while((buf = bre.readLine()) != null) {
                            System.err.println(buf + "\n");
                        }
                    } catch (IOException ex) {
                    }
                }
            });
            thre.start();
            try {
                thro.join();
                thre.join();
                p.waitFor();
            } catch (InterruptedException ex) {
            }
            bri.close();
            bre.close();
        } catch (IOException ex) {
            ex.printStackTrace();
            return false;
        }
        return true;
    }

             bre.close();

azzz... grazie
ora provo


 ora provo
nada mi si appende e non ho nulla nè su InputStream nè su ErrorStream....


             bre.close();

Ho provato ora a togliere il waitFor() ma rimane comunque appeso.
Mi scrive qualcosa in piů... ma non porta al completamento il processo.
Potrebbe essere che scriva da un'altra parte... o che sia qualcos'altro a
scrivere nel caso in cui lancio da dos (molto probabilmente il comando che
lancio parla con un servizio o qualcosa del genere) scrive :
blablabla versione xxx <- e si vede
mi sto connettendo con ... <- questa linea non si vede e si appende
importazione in corso...
importazione terminata ...
Grazie
