Domanda

Ho una classe che gestisce la creazione di documenti RTF e un metodo in quella classe che chiama l'editor RTF con un file XML per la visualizzazione.

Tutti gli utenti tranne uno possono accedere a questo editor senza problemi. Questo utente si imbatte costantemente in un problema in cui la sua applicazione si blocca. Non ci sono errori in alcun registro. Normalmente questo tipo di problema viene facilmente identificato, riprodotto e corretto, tuttavia, non posso per la vita del mio riprodurlo, quindi i miei tentativi di debug stanno fallendo.

Fondamentalmente il codice è il seguente:

int exitVal = CUBSRTFEditor.runRTFEditor("c:\\tmp\\control"+ap_doc_id+".xml", xml,"I:\\AppealsLetters.exe /process \"c:\\tmp\\control"+ap_doc_id+".xml\"");

public static int runRTFEditor(String xmlLocation, String xmlContent, String executePath)
{
    int exitVal = 0;
    createLocalFile(xmlLocation, xmlContent);

    try
    {
        System.out.println("executePath must = "+executePath);
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(executePath);
        System.out.println("after executePath runs");

        //exhaust that stream before waiting for the process to exit
        InputStream inputstream = proc.getInputStream();
        InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
        BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
        // read the ls output
        String line;
        while ((line = bufferedreader.readLine())!= null)
        {
            System.out.println(line);
        }
        exitVal = proc.waitFor();
    }
    catch (Throwable t)
    {
        t.printStackTrace();
    }

    CUBSRTFEditor.deleteTempFile(xmlLocation);

    return exitVal;
}

L'ultimo output è il primo System.out. Quando prendo il file XML ed eseguo questo su qualsiasi altro PC, viene eseguito senza problemi. Non vedo informazioni utili in proc.getErrorStream () o proc.getOutputStream ().

La documentazione Javadoc del JDK su questo problema (esecuzione sospesa): Poiché alcune piattaforme native forniscono solo dimensioni di buffer limitate per flussi di input e output standard, la mancata scrittura del flusso di input o la lettura del flusso di output del sottoprocesso può causare il blocco del processo secondario e persino il deadlock.

Provo a esaurire quel flusso prima di aspettare che il processo si concluda e questo non sembra aiutare in quanto non sembra arrivare a quel punto (il secondo System.out non viene visualizzato)

L'ho implementato in modo errato? Mi sto perdendo qualcosa di importante? Qualsiasi idea su come ottenere maggiori informazioni dal processo sarebbe ottima.

Sono bloccato ....

È stato utile?

Soluzione

Runtime.exec () è un piccolo spud ingannevole con cui lavorare. Ho trovato questo articolo (vecchio, ma ancora pertinente) per essere abbastanza utile. Puoi sempre passare a un codice di esempio altamente gankable. : -)

A colpo d'occhio, il tuo codice deve gestire sia proc.getOutputStream () che proc.getErrorStream (), che è una buona ragione per gestire questi flussi in thread separati.

Altri suggerimenti

Volevo aggiornarlo perché la modifica è passata alla produzione oggi e ha funzionato. Sulla base dei suggerimenti di BlairHippo, sono riuscito a lavorare con una classe interna anonima per creare un thread separato per esaurire i flussi di errore e di input.

new Thread(new Runnable(){
    public void run()
    {
        try
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
            String line;
            while ((line = br.readLine())!= null)
            {
                System.out.println(line);
            }
        }
        catch (Throwable t)
        {
            t.printStackTrace();
        }
    }
}).start();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top