我正在使用ColdFusion MX7在某些Java 6代码上执行CFEXECUTE。
不幸的是,由于CF7在JDK 6下不起作用,我必须这样做。
我的问题是,当Java代码中发生异常时,如果我在异常上调用printStackTrace
,则CFEXECUTE命令会挂起。 ColdFusion最终会超时,但Java进程仍然在后台挂起。
我猜测有一些障碍,但我似乎无法弄清楚原因。
如果我不做printStackTrace
,那么一切正常。
例外是使用JAXWS从Oracle Information Rights Management wsdl生成的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 :(得分:4)
是的,e.printStackTrace();
写入stderr(标准错误流)。由于cfexecute
不捕获stderr,这可能是导致cfexecute挂起的原因。有一个补丁来修复CF8中的这种行为。
由于您使用的是7,请尝试Ben Forta的提示:
同时使用/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();
}
}
}