2015-09-03 11 views
6

Po pierwsze, tak, szukałem i, tak, przeczytałem ten sam dokument Apache, na który wskazuje każdy punkt. :-) Myślę, że jest trochę zamieszania i myślę, że znam odpowiedź, więc pozwól mi przedstawić przykład tego, co uważałem za poprawne, podążaj za tym, co myślę, że jest odpowiedź. Dzięki. Aha, i wiem, że niektóre z linii endChoice() nie są bezwzględnie konieczne i że Camel to zrozumie, ale lubię klocki, które mają być czysto wytyczone, chyba że istnieją powody, aby ich nie używać.Camel end vs endChoice - nie jest to zwykłe zapytanie

.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 

Więc moje oryginalne spojrzenie na API, myślałem, że koniec() był do zamykania rzeczy jak wybór i split i tym endChoice() zostało do zamykania możliwości wyboru, kiedy i jak inaczej. Wygląda bardziej na to, że ten drugi jest faktycznie endem(), który zwraca ChoiceDefinition. Co sprawia, że ​​nazwa jest trochę lepsza.

Ale jeśli wyjmę koniec() oznaczony jako "zamknij wewnętrzny blok wyboru", oznacza to, że kontynuuję do następnego wiersza, endChoice(). Czy to powoduje zamknięcie bloku wewnętrznego wyboru? Biorąc to pod uwagę, czas (X2) nadal znajduje się w bloku, gdy (X1). Tak, myślę, że muszę zastąpić end() z endChoice() zamiast usuwania go. Tak więc wynik będzie wyglądał następująco:

.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 

Czy to sposób radzenia sobie z tym w Camel? Czy jest prostszy sposób, którego mi brakuje? Dziękuję za Twój czas.

Odpowiedz

10

Krótka odpowiedź: wezwę się na to, aby nikt inny nie ma do, odpowiedź brzmi, że robisz to źle i nie powinny mieć zagnieżdżone wyborów.

długa odpowiedź: odziedziczyłem skomplikowaną budowniczy trasy i próbował go oczyścić, aby uczynić go bardziej zrozumiałym. Ale prostowanie i umieszczanie w obu końcówkach() lub endChoice() po prostu zepsuło rzeczy. I tak, powyższa poprawka nadal niszczyła sprawy. Nie rozumiałem, jak Camel wiedział, do którego bloku się udać. Badania i próby znalezienia dobrych przykładów zagnieżdżania ostatecznie doprowadziły do ​​tego, że Camel jest naprawdę zaprojektowany do zagnieżdżania wyborów. Pozwala na to, ale z powodu ograniczeń w Javie nie robi tego dobrze. Próbowałem usunąć moje zagnieżdżone wybory. Chociaż byłoby to możliwe, byłoby to oznaczało brzydkie nadmiarowych warunkowe, takie jak:

Tylko że kopalnia nie miało przynajmniej innym poziomie. Dalsza refleksja i przypominanie sobie rzeczy, które przeczytałem, przyniosły drugi oświecenie. Cały punkt Camel kieruje trasami. Każdy wybór, kiedy blok powinien tylko wskazywać proces na trasę. Nie powinno to być myślenie, przetwarzanie ani cokolwiek innego. W końcu nasza grupa będzie refaktoryzować, aby usunąć większość logiki z budowniczego tras do fasoli. Projekt, nad którym będziemy pracować, będzie czymś prostym:

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() 

Moja rada dla Ciebie to unikanie zagnieżdżania. Szczególnie skomplikowane. Możesz go uruchomić, ale nie będziesz mógł mu zaufać, kiedy będziesz musiał wprowadzić zmiany później. Jeśli masz ochotę użyć opcji zagnieżdżonych, sprawdź, co próbujesz osiągnąć i zdecyduj, czy naprawdę należy do budowniczego tras.

+2

Dobra rada, staram się również nie zagnieździć wyborów. Twoi koledzy lub twoja przyszłość będą Ci wdzięczni;). – helpermethod