Newsgroup: it.comp.java
Titolo: Limitazioni di Runtime.exec() [Lungo].

Salve a tutti,
di recente è sorto un problema in una mia applicazione java.
L'applicazione ha il compito di ricevere da un client delle richieste per
l'esecuzione, sulla macchina che ospita il server, di alcune applicazioni
win32 attraverso la chiamata Runtime.exec() ad un bat che le lancia.
Ho eseguito di recente l'upgrade di una di queste applicazioni e la cosa ha
scassato il tutto.
Il problema è che il bat file viene lanciato ma ad un certo punto, in
corrispondenza dell'esecuzione di un ben definito exe, si ferma e il tutto
si completa solo se spengo, o interrompo la mia applicazione server
all'interno della quale viene eseguito il Runtime.exec().
Non c'è nessun problema se lancio il bat file in una shell del DOS.
Per scrupolo e per paura di qualche deadlock nel mio server ho anche creato
un'applicazione di test che non fa altro che il Runtime.exec() del bat in
questione ma il problema si ripresenta.
Il mio sospetto è che la nuova versione dell'exe che viene lanciato sia
diventata molto più esosa in termini di risorse e che "intasi" il thread
all'interno del quale la JVM lo relega e solo l'eliminazione della JVM che
lo contiene gli permetta di espandersi ai limiti necessari per il suo
completamento.
Ho provato anche a modificare le risorse a disposizione della JVM che
contiene il mio server attraverso i vari flag -Xms, -Xmx e -Xss, ma nulla è
cambiato.
La mia domanda è duplice: innanzitutto so che non avendo le specifiche
dell'exe "esoso" è difficile parlare in termini assoluti, comunque, qualcuno
è a conoscenza di particolari limiti del Runtime.exec() che possano spiegare
il mio problema? In alternativa, esistono attributi manipolabili per
modificare le risorse attribuite ad un singolo Thread?
Grazie a tutti per l'attenzione,
Oliviero

 all'interno della quale viene eseguito il Runtime.exec().
Combinazione, anch'io mi sono imbattuta in un problema simile: se cerco 
di lanciare da java un'istruzione che fa partire SQLPlus con un 
particolare script, si pianta tutto, a meno che non tolga il waitFor(). 
Togliendo il waitFor() tutto funziona a perfezione, peccato che, 
ovviamente, non attende la fine dello scriptino sql (e, quindi, non 
riesco a sincronizzare le operazioni). Purtroppo, non ho trovato nessuna 
soluzione ed ho dovuto aggirare il problema in un altro modo.
Se qualcuno ha dei suggerimenti e/o spiegazioni, anch'io gli saro' 
riconoscente :-)
Ciao,
Tatiana

Non e' che l'exe che viene mandato in esecuzione dal .bat cerca di scrivere
sullo
str input o sullo std err?
A me capitava una cosa simile cercando di lanciare gostscript.
Io ho risolto cosi':
try{
  Process p = Runtime.getRuntime().exec(comando);
  BufferedReader  i = new BufferedReader(
                          new InputStreamReader(p.getInputStream()));
  BufferedReader  e = new BufferedReader(
                        new InputStreamReader(p.getErrorStream()));
  while (i.readLine() != null && e.readLine() != null) {}
} catch (Exception ex) {}
Spero di esserti stato utile.
Ciao
Franco

 Ciao

 Tatiana
Ciao,
Oliviero.

 riconoscente :-)
Un problema classico col waitFor() e' l'overflow del buffer di output
se non e' consumato che per default e' 1K. Il trucco e' che l'output *va* 
consumato. :-)
Cfr. 
http://developer.java.sun.com/developer/bugParade/bugs/4062587.html
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 Cfr. 
http://developer.java.sun.com/developer/bugParade/bugs/4062587.html
Grazie 1000, ho visto: che cavolata!
Ciao,
Tatiana