当前位置: 首页 > 面试题库 >

在PrintStackTrace之后如何防止CFEXECUTE挂起 爪哇

严俊彦
2023-03-14
问题内容

我正在使用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();
    }
}

Here is the ColdFusion call:

<!--- 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:几个难题用于运行命令并在完成时终止的标志:使用CFEXECUTE执行命令行实用程序同时使用/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 Class:

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


 类似资料:
  • 问题内容: 我正在使用ColdFusion MX7对某些Java 6代码执行CFEXECUTE。 不幸的是,由于CF7在JDK 6下不起作用,所以我必须这样做。 我的问题是,如果在Java代码中发生异常,如果我在异常上调用a ,则CFEXECUTE命令会挂起。ColdFusion最终超时,但是Java进程继续在后台挂起。 我猜有一些障碍正在发生,但我似乎无法弄清楚为什么。 如果我不这样做,那么一切

  • 问题内容: 使用不同的Java库执行数百万个HTTP请求,使我陷入困境: 这是功能。 我试图设置Apche Http Client,并在所有可能的超时(我希望)上超时,但仍然 (可能无限)挂起。如何摆脱它们? 挂断率大约是每10000个请求〜1(对10000个不同的主机),并且可能会永远持续下去(我已确认线程挂起在10小时后仍然有效)。 Windows 7上的JDK 1.8。 我的工厂: 我的工厂

  • 我有一个命名管道文件,如下所示: 当我在PHP中执行类似操作时: 它挂起(即永不返回)。是否有办法使此呼叫返回和/或超时? (编辑) 请注意,我希望一个进程以写权限打开此管道,另一个进程以读权限打开此管道。有人在向这根管子写信,而另一个人在从这根管子读书。问题是读者有时会挂在fopen()上——不管它成功与否,我总是想返回它。

  • 问题内容: 我正在制作一个Android应用程序,该应用程序对您所能获得的积分有时间限制。但是,如果您关闭该应用程序,计时器将继续运行。应用程序暂停时如何暂停? 问题答案: 您可以用类似的方法取消它 并使用该变量保存在一个或其他持久变量中。然后再次使用该变量以启动计时器 共享偏好

  • 首先,这不是重复的: 好的,这是我的错误: 我所做的: 在VisualStudio中,我尝试拉取并更新一个分支,得到了提到的错误。谷歌搜索了一下,发现另一个git进程中的解决方案似乎正在这个存储库中运行,转到命令行(不是git bash),试图删除索引。锁定失败,转到git bash,尝试删除索引。锁,没有错误索引仍然存在(我猜它不是index.lock只是index)。去了VisualStudi

  • 我用的是JavaFX。 当某个文件没有加载时,我希望阶段关闭,该实例中的代码停止执行。