How do I keep CFEXECUTE from hanging after a PrintStackTrace

浪子不回头ぞ 提交于 2019-11-26 14:52:58

问题


I'm using ColdFusion MX7 to perform a CFEXECUTE on some Java 6 code.

Unfortunately, since CF7 does not work under JDK 6 I must do it this way.

My problem is that when an exception happens in the Java code if I call a printStackTrace on the exception the CFEXECUTE command hangs. ColdFusion eventually times out but the Java process continues to hang in the background.

I'm guessing there is some blocking going on but I can't seem to figure out why.

If I don't do a printStackTrace then everything works fine.

The exceptions are WebService exceptions generated with JAXWS from the Oracle Information Rights Management wsdl.

EDIT

I noticed that I am able to call the printStackTrace with a file PrintStream as a parameter and it works fine. So, it looks like the error stream is having troubles.

Here is the Java 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();
    }
}

Here is the ColdFusion call:

<!--- 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>

回答1:


Yes, e.printStackTrace(); writes to stderr (standard error stream). Since cfexecute does not capture stderr, that is probably what is causing cfexecute to hang. There was a patch to fix this behavior in CF8.

Since you are using 7, try Ben Forta's tips about:

  • Redirecting stderr to stdout: A Couple Of Gotchas
  • Flags to run commands and terminate upon completion: Using CFEXECUTE To Execute Command Line Utilities

Using both /c and 2>&1 should get rid of the hanging problem.

Update: Added Example

ColdFusion 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>  

Java Class:

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


来源:https://stackoverflow.com/questions/1002025/how-do-i-keep-cfexecute-from-hanging-after-a-printstacktrace

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!