Wie verhindere ich, dass CFEXECUTE nach einem PrintStackTrace hängen bleibt?

Ich verwende ColdFusion MX7, um eine CFEXECUTE für Java 6-Code auszuführen.

Da CF7 unter JDK 6 leider nicht funktioniert, muss ich das so machen.

Mein Problem ist, dass, wenn eine Ausnahme im Java-Code auftritt, wenn ich a aufrufeprintStackTrace In der Ausnahme bleibt der Befehl CFEXECUTE hängen. Bei ColdFusion tritt eine Zeitüberschreitung auf, der Java-Prozess bleibt jedoch weiterhin im Hintergrund hängen.

Ich vermute, es gibt einige Blockierungen, aber ich kann nicht herausfinden, warum.

Wenn ich nicht macheprintStackTrace dann funktioniert alles gut.

Die Ausnahmen sind WebService-Ausnahmen, die mit JAXWS von der Oracle Information Rights Management-WSDL generiert wurden.

BEARBEITEN

Mir ist aufgefallen, dass ich die anrufen kannprintStackTrace mit einer DateiPrintStream als Parameter und es funktioniert gut. Es sieht also so aus, als ob der Fehlerstrom Probleme hat.

Hier ist der Java-Code:

<code>public void Execute(){
    AdminUtils AU = AdminUtils.GetInstance();

    AccountServicesPort AA = AU.GetAccountServicesPort(); 

    LicenseServerRef LicSerRef = AU.GetLicenseServerRef();

    User UserToSave = new User();
    UserToSave.setUserName(UserName);
    UserToSave.setFirstName(FirstName);
    UserToSave.setLastName(LastName);
    UserToSave.setEmailAddress(EmailAddress);
    UserToSave.setServer(LicSerRef);

    try{
        AU.LogMessage("Change User: " + UserName + " " + FirstName + " " + LastName + " " + EmailAddress);
        AA.saveChangesToUser(UserToSave);
    }catch(Exception e){
        e.printStackTrace();
    }
}
</code>

Hier ist der ColdFusion-Aufruf:

<code><!--- Update the IRM User. --->
<CFEXECUTE name="c:\Program Files\Java\jdk1.6.0_14\bin\javaw.exe"
           arguments="-cp C:\CFusionMX7\Externals\IRM.jar;C:\CFusionMX7\Externals\Config IRMWebServices.UpdateUser #LoginID# #NewFname# #NewLname#"
           timeout="15" 
           variable="OUTPUT">
</CFEXECUTE>
</code>
 Boris Pavlović16. Juni 2009, 17:06
Könnten Sie etwas Code einfügen?

Antworten auf die Frage(1)

Lösung für das Problem

e.printStackTrace(); schreibt nach stderr (standard error stream). Schon seitcfexecute erfasst stderr nicht, das ist wahrscheinlich der Grund, warum cfexecute hängt. Es gab einen Patch, um dieses Verhalten in CF8 zu beheben.

Probieren Sie die folgenden Tipps von Ben Forta aus, da Sie 7 verwenden:

Stderr nach stdout umleiten:Ein paar FallstrickeFlags, um Befehle auszuführen und nach Abschluss zu beenden:Verwenden von CFEXECUTE zum Ausführen von Befehlszeilendienstprogrammen

Beides verwenden/c und2>&1 sollte das hängende Problem loswerden.

Update: Beispiel hinzugefügt

ColdFusion-Code:

<code><cftry>  
    <cfset argString = '/c "C:\Program Files\Java\jdk1.6.0_13\bin\java.exe" -cp c:\myJar.jar TestStdErr 2>&1'  >  
    <cfexecute name="c:\windows\system32\cmd.exe" 
        arguments="#argString#"    
        outputFile="c:\cfexcuteResults.log" 
        timeout="5" />  
    <cfcatch>  
       <cfdump var="#cfcatch#">  
    </cfcatch>  
</cftry>  
</code>

Java-Klasse:

<code>public class TestStdErr {
    public static void main(String[] args) {
        try {
            // cause a divide by zero exception 
            int a = 0;
            int b = 2 /a;
         }
         catch(Exception e){
            e.printStackTrace();
        }
    }
}
</code>
 Tom Hubbard16. Juni 2009, 19:21
Vielen Dank. Ich habe diese früher gefunden. Das Problem ist nicht, dass ich die Fehlerdaten benötige. Es hängt nur, wenn der Trace darauf gedruckt wird.
 Tom Hubbard16. Juni 2009, 21:28
Du hast Recht. Vielen Dank.
 Leigh16. Juni 2009, 20:40
Ich glaube, die Tatsache, dass stderr nicht erfasst wird, ist ein Teil dessen, was dazu führt, dass cfexecute hängt. Versuchen Sie, beide Flags / c und 2> & 1 zu verwenden. Damit sollte das Problem des Aufhängens behoben sein.

Ihre Antwort auf die Frage