2

ColdFusion MX7 を使用して、Java 6 コードで CFEXECUTE を実行しています。

残念ながら、CF7 は JDK 6 では動作しないため、この方法で行う必要があります。

私の問題は、例外で a を呼び出すと Java コードで例外が発生するとprintStackTrace、CFEXECUTE コマンドがハングすることです。ColdFusion は最終的にタイムアウトしますが、Java プロセスは引き続きバックグラウンドでハングアップします。

何らかのブロックが行われていると推測していますが、その理由がわかりません。

私がしなければprintStackTrace、すべてうまくいきます。

例外は、Oracle Information Rights Management 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();
    }
}

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>
4

1 に答える 1

5

はい、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();
        }
    }
}
于 2009-06-16T16:27:24.287 に答える