如何在PrintStackTrace之后保持CFEXECUTE不挂起
我正在使用ColdFusion MX7在某些Java 6代码上执行CFEXECUTE。
不幸的是,由于CF7在JDK 6下不起作用,我必须这样做。
我的问题是,当Java代码中发生exception时,如果我在exception上调用printStackTrace
,则CFEXECUTE命令会挂起。 ColdFusion最终超时,但Java进程继续在后台挂起。
我猜测有一些阻塞,但我似乎无法弄清楚原因。
如果我不做printStackTrace
那么一切正常。
例外情况是使用JAXWS从Oracle Information Rights Management wsdl生成的WebServiceexception。
编辑
我注意到我可以使用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调用:
是的, e.printStackTrace();
写入stderr(标准错误流)。 由于cfexecute
不捕获stderr,这可能是导致cfexecute挂起的原因。 有一个补丁来修复CF8中的这种行为。
由于您使用的是7,请尝试Ben Forta的提示:
- 将stderr重定向到stdout: 几个陷阱
- 运行命令并在完成时终止的标志: 使用CFEXECUTE执行命令行实用程序
使用/c
和2>&1
应该摆脱悬挂问题。
更新:添加示例
ColdFusion代码:
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(); } } }