java - 如何防止 CFEXECUTE 在 PrintStackTrace 之后挂起

标签 java coldfusion cfexecute

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

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

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

我猜测发生了一些阻塞,但我似乎无法弄清楚为什么。

如果我不执行printStackTrace,那么一切都会正常工作。

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

编辑

我注意到我可以使用文件 PrintStream 作为参数来调用 printStackTrace 并且它工作正常。所以,看起来错误流有问题。

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

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

关于java - 如何防止 CFEXECUTE 在 PrintStackTrace 之后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1002025/

相关文章:

coldfusion - CFExecute 不执行命令

java - Libgdx 子弹显示碰撞对象

java - SonarQube 无法理解 Java 内联表达式进行 null 检查

session - 更新 session 变量是否将用户踢到登录页面?

php - 到 Flex/Flash 后端的 ColdFusion(来自 PHP)?

session - 具有多个域的 ColdFusion session 管理/用户身份验证

java - 使用 BoxLayout 布局管理器自动调整高度

java - 如何在play 2.4中使用CommonsMailerPlugin

coldfusion - 使用 CFEXECUTE 返回所有输出

coldfusion - ColdFusion 是否触发 CFEXECUTE 然后离开,还是等待 CFEXECUTE 完成?