2012-02-14 5 views
7

Sto provando a creare un'applicazione con più route cammello che utilizzano internamente molti percorsi comuni. Quindi, sto cercando di separare le rotte in diverse classi del Route Builder e quindi collegare le rotte dove necessario.La gestione delle eccezioni Camel non funziona se la clausola delle eccezioni è definita in una classe separata

Per esempio, tutti gli itinerari relativi a inviare e-mail andare in una classe EmailRouteBuilder e tutti gli itinerari che si occupano di un particolare JMS coda vanno in MyQueueRouteBuilder classe. Suppongo che questo dovrebbe andar bene visto che Camel non fa distinzioni tra le classi e cerca solo la definizione delle rotte.

Inoltre, sto anche raggruppando diverse rotte di gestione delle eccezioni in un ExceptionHandlingRouteBuilder separato.

Sono anche collegando tutte le diverse classi insieme con la definizione del contesto cammello in primavera in questo modo -

<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring"> 
    <propertyPlaceholder id="properties" location="classpath:${env}/autoimport.properties"/> 
    <!-- Common Routes --> 
    <routeBuilder ref="emailRouteBuilder" /> 
    <routeBuilder ref="myQueueRouteBuilder" /> 
    <routeBuilder ref="httpRouteBuilder" /> 
    <routeBuilder ref="exceptionsRouteBuilder" /> 
    <routeBuilder ref="customer1RouteBuilder" /> 
    <routeBuilder ref="customer2RouteBuilder" /> 

</camelContext> 

mio exceptionsRouteBuilder contiene molte clausole di eccezione come -

onException(ConnectException.class) 
      .routeId("connectExceptionEP") 
      .handled(true) 
      .log("Caught Exception: ") 
      .to("direct:gracefulExit"); 

.. 
.. 
.. 

Tuttavia, sembra che c'è un problema con le eccezioni definite in un'altra classe o, per quella materia, definite separatamente dalla definizione della rotta principale.

Ho verificato questo nei registri cercando i percorsi da avviare (da routeId) e controllando anche quando viene lanciata un'eccezione.

Inoltre, per confermare ulteriormente, ho preso la route di gestione http Connect Exception e l'ho inserita direttamente in httpRouteBuilder e lo ..! , la gestione delle eccezioni adesso va bene per questa eccezione ..

Mi manca qualcosa qui per far funzionare tutte le eccezioni pur essendo ben definite nella sua stessa classe. ?

Sto usando Apache Camel 2.9.0, ma ho verificato lo stesso comportamento anche in 2.8.3.

Grazie, Anand

risposta

11

corretta, l'onException() clausole si applicano solo alle attuali definizioni di percorso di RouteBuilder ...

che ha detto, è possibile riutilizzare queste definizioni da avere tutti i vostri RouteBuilders estendono l'ExceptionRouteBuilder e chiamare super.configure() ... qualcosa di simile

public class MyRouteBuilder extends ExceptionRouteBuilder { 
    @Override 
    public void configure() throws Exception { 
     super.configure(); 
     from("direct:start").throwException(new Exception("error")); 
    } 
} 
... 
public class ExceptionRouteBuilder implements RouteBuilder { 
    @Override 
    public void configure() throws Exception { 
     onException(Exception.class).handled(true).to("mock:error"); 
    } 
} 

o anche solo avere un metodo statico in una classe ExceptionBuilder per impostare le clausole per una determinata istanza RouteBuilder

public class MyRouteBuilder extends RouteBuilder { 
    @Override 
    public void configure() throws Exception { 
     ExceptionBuilder.setup(this); 
     from("direct:start").throwException(new Exception("error")); 
    } 
} 
... 
public class ExceptionBuilder { 
    public static void setup(RouteBuilder routeBuilder) { 
     routeBuilder.onException(Exception.class).handled(true).to("mock:error"); 
    } 
} 
+0

bello .. grazie per quello ... –

+0

Grande consiglio! Stavo cercando di capire perché l'onException non è stata attivata. –

0

Sulla base della risposta accettata, ho trovato un modo più pulito per implementare la gestione delle eccezioni, in modo da non dover chiamare super.configure() in ogni percorso. Basta chiamare un metodo che gestisca onException nel costruttore della classe base.

//Base class that does exception handling 
public abstracExceptionRouteBuildert class BaseAbstractRoute extends RouteBuilder { 
    protected BaseAbstractRoute() { 
    handleException(); 
    } 

    private void handleException() { 
    onException(Exception.class).handled(true).to("mock:error"); 
    } 
} 

//Extend the base class 
public class MyRouteBuilder extends BaseAbstractRoute { 
    @Override 
    public void configure() throws Exception { 
    from("direct:start").throwException(new Exception("error")); 
    } 
}