Tom*_*ard 2 java coldfusion cfexecute
我正在使用ColdFusion MX7对某些Java 6代码执行CFEXECUTE。
不幸的是,由于CF7在JDK 6下不起作用,所以我必须这样做。
我的问题是,如果在Java代码中发生异常,如果我printStackTrace在异常上调用a ,则CFEXECUTE命令会挂起。ColdFusion最终超时,但是Java进程继续在后台挂起。
我猜有一些障碍正在发生,但我似乎无法弄清楚为什么。
如果我不这样做,printStackTrace那么一切正常。
异常是从Oracle信息权限管理wsdl用JAXWS生成的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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是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>
Run Code Online (Sandbox Code Playgroud)
是的,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>
Run Code Online (Sandbox Code Playgroud)
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)