2009-06-16 31 views
2

我正在使用ColdFusion MX7在某些Java 6代码上执行CFEXECUTE。如何保持CFEXECUTE在PrintStackTrace后挂起

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

我的问题是,如果我在异常中调用printStackTrace时,Java代码中发生异常,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(); 
    } 
} 

这里是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> 
+0

你能粘贴一些代码? – 2009-06-16 15:06:55

回答

4

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

由于您使用的7,尝试本·福尔塔的有关提示:

同时使用/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(); 
     } 
    } 
} 
+0

谢谢。我早些发现了这些。问题不在于我需要err流信息。它只是在轨迹被打印时挂起。 – 2009-06-16 17:21:14