2009-06-16 6 views
2

J'utilise ColdFusion MX7 pour exécuter un CFEXECUTE sur du code Java 6.Comment empêcher CFEXECUTE de se bloquer après un PrintStackTrace?

Malheureusement, comme CF7 ne fonctionne pas sous JDK 6, je dois le faire de cette façon.

Mon problème est que lorsqu'une exception se produit dans le code Java si j'appelle un printStackTrace sur l'exception la commande CFEXECUTE se bloque. ColdFusion expire mais le processus Java continue de se bloquer en arrière-plan.

Je suppose qu'il y a du blocage mais je n'arrive pas à comprendre pourquoi. Si je ne fais pas un printStackTrace, alors tout fonctionne bien.

Les exceptions sont les exceptions WebService générées avec JAXWS à partir d'Oracle Information Rights Management wsdl.

EDIT

J'ai remarqué que je suis en mesure d'appeler le printStackTrace avec un fichier PrintStream en tant que paramètre et il fonctionne très bien. Donc, il semble que le flux d'erreurs a des problèmes.

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

Voici l'appel 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

Pouvez-vous coller un code? –

Répondre

4

Oui, e.printStackTrace(); écrit à stderr (flux d'erreur standard). Puisque cfexecute ne capture pas stderr, c'est probablement ce qui provoque le blocage de cfexecute. Il y avait un correctif pour corriger ce comportement dans CF8.

Puisque vous utilisez 7, essayez les conseils de Ben Forta sur:

utilisant à la fois /c et 2>&1 devrait se débarrasser du problème d'accrochage.

Mise à jour: Ajout d'un exemple

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

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

Merci. Je les ai trouvés plus tôt. Le problème n'est pas que j'ai besoin de l'info de flux d'erreur. Il se bloque lorsque la trace est imprimée. –

+1

Je crois que le fait que stderr ne soit pas capturé fait partie de ce qui provoque le blocage de cfexecute. Essayez d'utiliser les deux drapeaux/c et 2> & 1, et il devrait se débarrasser du problème d'accrochage. – Leigh

+0

Vous avez raison. Merci beaucoup. –

Questions connexes