Frage

Ich habe eine Klasse, die die Erstellung von RTF-Dokumenten und ein Verfahren in dieser Klasse verwaltet, die den RTF-Editor mit einer XML-Datei für die Anzeige aufruft.

Alle bis auf einen Benutzer kann diesen Editor ohne Probleme zugreifen. Dieser Benutzer führt konsequent in ein Problem, wo ihre Anwendung nur hängt. Es gibt keine Fehler in allen Protokollen. Normalerweise wird diese Art von Problem leicht zu identifizieren, reproduziert und korrigiert, aber ich kann nicht für das Leben meines reproduce es so bei Debuggen meine Versuche fehlschlagen.

Im Grunde ist der Code wie folgt:

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;
}

Die letzte Ausgabe ist die erste System.out. Wenn ich die XML-Datei übernehmen und führen diese auf einem anderen PC führt es ohne Frage. Ich sehe keine nützlichen Informationen in proc.getErrorStream () oder proc.getOutputStream ().

Die Javadoc Dokumentation des JDK auf dieses Problem (exec hanging): Da einige nativen Plattformen nur begrenzte Puffergröße für Standard-Eingangs- und Ausgangsströme liefern, das Versagen des sofort den Eingangsstrom zu schreiben oder den Ausgangsstrom des subprocess lesen kann bewirken, dass der Teilprozess blockieren und sogar Deadlock.

ich versuche, diesen Strom erschöpfen, bevor sie für den Prozess warten zu beenden und das scheint nicht zu helfen, wie es nie zu diesem Punkt zu gelangen scheint (die zweite System.out wird nicht angezeigt)

Habe ich das falsch umgesetzt? Fehle ich etwas Wichtiges? Alle Ideen, wie weitere Informationen aus dem Prozess zu bekommen wären toll.

Ich bin fest ....

War es hilfreich?

Lösung

Runtime.exec () ist eine täuschend fiese kleine Knolle mit zu arbeiten. Ich fand diesem Artikel (alt, aber noch relevant) als sehr hilfreich. Sie können jederzeit auf Seite 4 für einige hoch gankable Beispielcode überspringen. : -)

Auf einen Blick, Ihr Code muss sowohl proc.getOutputStream () und proc.getErrorStream () zu handhaben, was ein guter Grund, diese Ströme in separate Threads zu verarbeiten.

Andere Tipps

Ich wollte diese aktualisieren, weil die Änderung in Produktion ging heute und arbeitete. Basierend off von BlairHippo Vorschlägen habe ich es mit einer anonymen inneren Klasse zu arbeiten, um einen separaten Thread zu erstellen, die die Fehler und Input Abgasströme.

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top