如何在PrintStackTrace之后保持CFEXECUTE不挂起

时间:2009-06-16 14:56:04

标签: java coldfusion

我正在使用ColdFusion MX7在某些Java 6代码上执行CFEXECUTE。

不幸的是,由于CF7在JDK 6下不起作用,我必须这样做。

我的问题是,当Java代码中发生异常时,如果我在异常上调用printStackTrace,则CFEXECUTE命令会挂起。 ColdFusion最终会超时,但Java进程仍然在后台挂起。

我猜测有一些障碍,但我似乎无法弄清楚原因。

如果我不做printStackTrace,那么一切正常。

例外是使用JAXWS从Oracle Information Rights Management wsdl生成的WebService异常。

修改

我注意到我可以使用文件printStackTrace作为参数调用PrintStream,它可以正常工作。因此,看起来错误流有麻烦。

这是Java代码:

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

以下是ColdFusion调用:

<!--- 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 个答案:

答案 0 :(得分:4)

是的,e.printStackTrace();写入stderr(标准错误流)。由于cfexecute不捕获stderr,这可能是导致cfexecute挂起的原因。有一个补丁来修复CF8中的这种行为。

由于您使用的是7,请尝试Ben Forta的提示:

同时使用/c2>&1可以摆脱悬而未决的问题。

更新:添加了示例

ColdFusion代码:

<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类:

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