我正在使用 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 的提示:
- 将 stderr 重定向到 stdout:A Couple Of Gotchas
- 运行命令并在完成后终止的标志:Using CFEXECUTE To Execute Command Line Utilities
同时使用 /c
和 2>&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/