Вопрос по coldfusion, java – Как сохранить CFEXECUTE от зависания после PrintStackTrace

2

Я использую ColdFusion MX7 для выполнения CFEXECUTE в некотором коде Java 6.

К сожалению, поскольку CF7 не работает под JDK 6, я должен сделать это таким образом.

Моя проблема в том, что когда в коде Java происходит исключение, если я вызываюprintStackTrace в исключении зависает команда CFEXECUTE. Время ожидания ColdFusion истекло, но процесс Java продолжает зависать в фоновом режиме.

Я предполагаю, что происходит какое-то блокирование, но я не могу понять, почему.

Если я не сделаюprintStackTrace тогда все работает нормально.

Исключениями являются исключения WebService, сгенерированные с помощью JAXWS из Oracle Information Rights Management wsdl.

EDIT

Я заметил, что могу позвонитьprintStackTrace с файломPrintStream как параметр и все работает нормально. Итак, похоже, что поток ошибок имеет проблемы.

Вот код Java:

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

Вот вызов ColdFusion:

<code><!--- 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>
</code>
Не могли бы вы вставить код? Boris Pavlović

Ваш Ответ

1   ответ
4

Да,e.printStackTrace(); пишет в stderr (стандартный поток ошибок). посколькуcfexecute не захватывает stderr, это, вероятно, вызывает зависание cfexecute. Был патч, чтобы исправить это поведение в CF8.

Поскольку вы используете 7, попробуйте советы Бена Форта о:

Используя оба/c а также2>&1 следует избавиться от проблемы с зависанием.

Update: Added Example

ColdFusion Code:

<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();
        }
    }
}
Благодарю. Я нашел это раньше. Проблема не в том, что мне нужна информация об ошибке потока. Он просто зависает, когда на него выводится след. Tom Hubbard
Я полагаю, что факт, что stderr не захвачен, является частью того, что заставляет cfexecute зависать. Попробуйте использовать флаги / c и 2 & gt; & amp; 1, и это должно устранить проблему зависания.
Ты прав. Большое спасибо. Tom Hubbard

Похожие вопросы