Newsgroup: it.comp.java
Titolo: Processo esterno da Servlet

Il mio servlet, invocato da una applet,  lancia un processo esterno (un
eseguibile scritto in C), quindi  aspetta che il processo termini e
ritorna il controllo alla applet. Utilizzando il servlet runner funziona
tutto molto bene mentre utilizzando un server servlet-enabled (ho già
provato con i  JavaWebServer 1.0.2, 1.1.3, 2.0 ed anche con il JRun), il
processo viene caricato in memoria (lo si vede dal Task Manager di NT4),
ma non parte mai. Il servlet aspetta la sua fine che, ovviamente, non si
verifica e non ritorna più alcun controllo alla applet.
Ecco il codice che utilizzo nel servlet per lanciare il processo:
     Process myProcess;
     Runtime runtime = Runtime.getRuntime();
     myProcess  =  runtime.exec("c:\<Path> \MyCProgram");
     try{
         myProcess.waitFor();
     }
         catch(Exception e){
     }
Sto utilizzando il jsdk2.0 e il jdk1.1.6.
Qualcuno ha idea di quale possa essere il problema?
Grazie mille.
Guglielmo
e-mail: 
gugl...@marchetti.net

 e-mail: 
gugl...@marchetti.net
Il problema potrebbe consistere nell'attendere che il programma in
esecuzione termini senza leggere i suoi stream di i/o, questo, in
particolare sulle piattaforme win32, causa un loop infinito di attesa ed
anche il crash dell'applicazione se si riempie il buffer di i/o.
Personalmente ho risolto tale problema con il segg. codice:
    // p e' il processo in esecuzione
    BufferedInputStream bins = new BufferedInputStream(p.getInputStream());
    BufferedInputStream bers = new BufferedInputStream(p.getErrorStream());
    BufferedOutputStream bous = new
   BufferedOutputStream(p.getOutputStream());
    int ex = 777;
    int r;
    while(ex == 777)
    {
        try{
           // Sleep this process for 1 second waiting the completing of
           // the process
           Thread.currentThread().sleep(1000);
            r = bins.available();
            if(r > 0)
            {
               while( r > 0)
               {
                   char b = (char)bins.read();
                   System.out.print(b);
                   r--;
               }
            }
            r = bers.available();
            if(r > 0)
            {
                while( r > 0)
                {
                   char b = (char)bers.read();
                  System.out.print(b);
                   r--;
                }
            }
            // Every call to Process.exitValue() cause the Exception
            // IllegalThreadStateException to be called if the
            // process is running, we catch it in the loop continuing to
            // wait
            ex = p.exitValue();
        }
        catch( IllegalThreadStateException  e ) {
         //System.err.println("ERROR run: " + e.getMessage() );
        }
    }
    bins.close();
    bers.close();
    bous.close();
Spero ti sia utile
Ciao
Peppix

Peppix wrote:

Grazie per avermi risposto, quello che mi hai scritto mi verrà certamente utile
in futuro. Riguardo al mio problema, è tutto risolto. Semplicemente dipendeva
dal fatto che l'applicazione lanciata dal servlet doveva scrivere su una
directory protetta.
In poche parole System (e quindi il server Web) aveva diritti solo per la
lettura e l'esecuzione, mentre io come utente (l'appletviewer era lanciato da me
e non da System) potevo accedere a questa directory anche in scrittura. Tutto
questo faceva si che l'applicazione funzionasse correttamente con l'appletviewer
piantandosi invece quando, lanciata dal servlet invocato dal server Web,
tentava di scrivere sulla directory incriminata.
Ciao
Guglielmo