2013-01-07 4 views
4

Je souhaite capturer toutes les exceptions des itinéraires.Apache Camel onException

-je ajouter cette OnExeption:

onException(Exception.class).process(new MyFunctionFailureHandler()).stop(); 

Ensuite, je crée la MyFunctionFailureHandler de classe.

public class MyFunctionFailureHandler implements Processor { 

@Override 
public void process(Exchange exchange) throws Exception { 
    Throwable caused; 

    caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class); 

    exchange.getContext().createProducerTemplate().send("mock:myerror", exchange); 
    } 

} 

Malheureusement, cela ne fonctionne pas et je ne sais pas pourquoi.

S'il y a une Exception, le programme doit s'arrêter.

Comment puis-je savoir pourquoi ce code ne fonctionne pas !!

thxs.

+1

Je dois demander ... Pourquoi ne pas onException (Exception.class) .pour ("Mock: myError") ? Pourquoi utiliser un processeur uniquement pour transférer vers un autre point de terminaison? – kaqqao

Répondre

0

garder à l'esprit que si vous avez des routes dans plusieurs classes de RouteBuilder, ayant un onExcpetion au sein de cette voie aura une incidence sur toutes les routes sous cette RouteBuilder ne

Critiquez ce answer

En outre, si une exception se produit dans un itinéraire et traitées dans cette voie, il ne sera pas propagé à la route de l'appelant d'origine, vous devez utiliser noErrorHandler() c.-à-from(direct:start).errorHandler(noErrorHandler()) pour propager l'exception manipulation à l'appelant

+0

Si elle ne sera pas propagée à l'appelant si elle n'a pas été * traitée dans la route interne, sauf si vous utilisez la solution de contournement que vous avez décrite. Mais je n'ai jamais eu la solution de contournement de travail .... – kaqqao

1

J'ai utilisé sur mon itinéraire:

public class MyCamelRoute extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 

     from("jms:start") 
      .process(testExcpProcessor) 

     // -- Handle Exceptions 
     .onException(Exception.class) 
     .process(errorProcessor) 
     .handled(true) 

     .to("jms:start"); 
    } 
} 

et dans mon errorProcessor

public class ErrorProcessor implements Processor { 

    @Override 
    public void process(Exchange exchange) throws Exception { 


    Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); 

    if(cause != null){ 
     log.error("Error has occurred: ", cause); 

     // Sending Error message to client 
     exchange.getOut().setBody("Error"); 
    }else 

     // Sending response message to client 
     exchange.getOut().setBody("Good"); 
    } 
} 

J'espère que cela aide

+0

à partir de Camel 2.10, l'onException doit être spécifié en haut de la route et la clause onException doit être terminée avec un end() –