2012-06-07 2 views
2

En utilisant la configuration de Mule et le code Java ci-dessous, je ne peux pas obtenir que Mule propage des exceptions via la liaison de composant. Comment puis-je faire passer les exceptions sur le service distant au composant appelant? Mule EE 3.2.2Les exceptions sont-elles propagées via les liaisons de composants?

Merci

La config Mule

<mule ...> 
    <flow name="Test"> 
    <vm:inbound-endpoint path="Test" exchange-pattern="request-response" /> 
    <component class="foo.Component"> 
     <binding interface="foo.Interface" method="bar"> 
       <vm:outbound-endpoint path="Interface.bar" 
        exchange-pattern="request-response" /> 
     </binding> 
     </component> 
    </flow> 

    <flow name="Interface.bar"> 
     <vm:inbound-endpoint path="Interface.bar" 
      exchange-pattern="request-response" /> 
     <scripting:component> 
      <scripting:script engine="groovy"> 
       throw new Exception(); 
      </scripting:script> 
     </scripting:component> 
    </flow> 
</mule> 

Le code Java

Component.java

package foo; 

public class Component { 

    private Interface theInterface; 

    public void foo(final String unused) throws Exception { 
     theInterface.bar(); 
    } 

    public void set(final Interface anInterface) { 
     theInterface = anInterface; 
    } 

} 

Interface.java

package foo; 

public interface Interface { 

    String bar() throws Exception; 

} 

Le pilote

package foo; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.runners.MockitoJUnitRunner; 
import org.mule.api.MuleException; 
import org.mule.api.client.MuleClient; 
import org.mule.tck.junit4.FunctionalTestCase; 


@RunWith(MockitoJUnitRunner.class) 
public class ATest extends FunctionalTestCase { 

    @Test(expected = Exception.class) 
    public void willItThrowException() throws MuleException { 
     final MuleClient client = muleContext.getClient(); 
     client.send("vm://Test", "", null, RECEIVE_TIMEOUT); 
    } 

    @Override 
    protected String getConfigResources() { 
     return "app/mule-config.xml"; 
    } 

} 

Répondre

2

Les exceptions ne sont pas propagées comme des "exceptions catapulté" à travers des échanges de messages, mais comme une charge utile d'exception sur le message en vol. La réponse de l'appel vm://Interface.bar doit donc être un message dont une charge d'exception est définie avec l'exception que vous avez levée. Étant donné que la liaison lie la charge utile principale à l'interface, il n'y a aucun moyen d'y accéder à partir du composant. Une option consisterait à ajouter un transformateur de réponse dans le flux Interface.bar qui copiera la charge utile d'exception (le cas échéant) dans la charge utile principale et autoriser bar() à renvoyer Object (parfois ce serait une chaîne, parfois une exception). Ou restez avec String et définissez une convention pour les erreurs renvoyées en tant que chaîne.

Questions connexes