簡體   English   中英

如何防止 CFEXECUTE 在 PrintStackTrace 之后掛起

[英]How do I keep CFEXECUTE from hanging after a PrintStackTrace

我正在使用 ColdFusion MX7 對某些 Java 6 代碼執行 CFEXECUTE。

不幸的是,由於 CF7 不能在 JDK 6 下工作,我必須這樣做。

我的問題是,當 Java 代碼中發生異常時,如果我對異常調用printStackTrace ,CFEXECUTE 命令將掛起。 ColdFusion 最終超時,但 Java 進程繼續在后台掛起。

我猜有一些阻塞正在進行,但我似乎無法弄清楚為什么。

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

異常是使用 JAXWS 從 Oracle 信息權限管理 wsdl 生成的 WebService 異常。

編輯

我注意到我可以使用文件PrintStream作為參數調用printStackTrace ,它工作正常。 所以,看起來錯誤 stream 有問題。

這是 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>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM