我如何避免CFEXECUTE在PrintStackTrace之后挂起

Tom*_*ard 2 java coldfusion cfexecute

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

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

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

我猜有一些障碍正在发生,但我似乎无法弄清楚为什么。

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

异常是从Oracle信息权限管理wsdl用JAXWS生成的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

Lei*_*igh 5

是的,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>  
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)