2015-09-03 28 views
6

In primo luogo, sì, ho cercato e, sì, ho letto lo stesso documento Apache ogni uno punta a. :-) Penso che ci sia un po 'di confusione e penso di conoscere una risposta, quindi lasciami un esempio di ciò che pensavo fosse corretto, seguilo con quello che penso sia la risposta. Grazie. Oh, e so che alcune delle linee endChoice() non sono strettamente necessarie e che Camel lo scoprirà, ma mi piace che i blocchi siano delineati in modo pulito, a meno che non vi sia qualche motivo per non usarli.Camel end vs endChoice - non la solita query

.choice() 
    .when(X1) 
     // do stuff 
     .choice() 
      .when(Y) 
       //do more stuff 
      .endChoice() // close inner when block 
     .end() // close inner choice block 
    .endChoice() // close first outer when 
    .when(X2) 
     // do other stuff 
    .endChoice() // close second outer when 
.end() // close outer choice 

Quindi, il mio aspetto originale al API, ho pensato che fine() è stato per le cose di chiusura come scelta e diviso e che endChoice() era per la chiusura di opzioni di scelta, come quando e non. Sembra più che quest'ultimo sia in realtà un end() che restituisce una ChoiceDefinition. Il che rende il nome un po 'migliore.

Tuttavia, se tolgo il termine() "blocco interno ristretto", questo significa che proseguo con la riga successiva, endChoice(). Questo allora chiude il blocco della scelta interiore? Detto questo, quando (X2) è ancora all'interno del blocco quando (X1). Quindi, penso di aver bisogno di sostituire end() con un endChoice() piuttosto che rimuoverlo. Quindi il risultato sarebbe:

.choice() 
    .when(X1) 
     // do stuff 
     .choice() 
      .when(Y) 
       //do more stuff 
      .endChoice() // close inner when block 
     .endChoice() // close inner choice block 
    .endChoice() // close first outer when 
    .when(X2) 
     // do other stuff 
    .endChoice() // close second outer when 
.end() // close outer choice 

Quindi questo è il modo di gestire questo in Camel? O c'è un modo più semplice che mi manca? Grazie per il tuo tempo.

risposta

10

BREVE RISPOSTA: io invocherò me stesso in questo modo che nessun altro ha a che, la risposta è che si sta facendo male e non dovrebbe avere scelte nidificate.

risposta lunga: Ho ereditato un complicato costruttore di percorso e stava cercando di ripulirlo per renderlo più chiaro. Ma raddrizzare e mettere in entrambe le estremità() o endChoice() ha appena rotto le cose. E, sì, la soluzione di cui sopra ha ancora rotto le cose. Non capivo come Camel sapesse a quale blocco andare. La ricerca e il tentativo di trovare buoni esempi di nidificazione alla fine hanno spinto a casa il fatto che Camel è non davvero progettato per le scelte di nidificazione. Lo consente, ma a causa delle limitazioni in Java, non lo fa bene. Così ho provato a rimuovere le mie scelte annidate. Anche se questo sarebbe stato possibile, avrebbe significato condizionali ridondanti brutte, come:

Solo miniera avrebbe avuto almeno un altro livello. Un ulteriore pensiero e il ricordo delle cose che avevo letto portarono al secondo pezzetto di illuminazione. L'intero punto di Camel sta dirigendo le rotte. Ogni scelta è quando il blocco dovrebbe semplicemente puntare il processo verso un percorso. Non dovrebbe pensare, elaborare o altro. Alla fine, il nostro gruppo effettuerà il refactoring per rimuovere la maggior parte della logica dal generatore di percorsi a un bean. Il progetto su cui lavoreremo sarà qualcosa di semplice:

from(uri) 
    .bean(class, method) // do any processing 
    .choice() 
     .when(header("result").isEqualTo("A") 
      .to(routeA) 
     .endChoice() 
     .when(header("result").isEqualTo("B") 
      .to(routeB) 
     .endChoice() 
     .when(header("result").isEqualTo("C") 
      .to(route) 
     .endChoice() 
     .end() 

Il mio consiglio è di evitare scelte di nidificazione. Particolarmente complicati. Potresti farlo funzionare, ma non sarai in grado di fidarti di esso quando dovrai apportare modifiche in seguito. Se ti senti tentato di usare le scelte annidate, esamina ciò che stai cercando di ottenere e decidi se appartiene davvero a un instradatore.

+2

Buon consiglio, cerco anche di non annidare le scelte. I tuoi colleghi o il tuo sé futuro ti ringrazieranno;). – helpermethod