2009-06-16 28 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