2017-02-02 26 views
9

Mam następujący trasa dla celów demonstracyjnychCamel adviceWith zachowuje się inaczej przy zmianie kolejność wypowiedzi splot

from("direct:external") 
    .routeId("external") 
    .to("http4://www.third-party.com/foo").id("ext"); 

Do testowania chciałabym * wymienić http4: punkt końcowy z bezpośrednim: punkt końcowy * dodaj makiety: punkt końcowy na końcu drogi do weryfikacji

Dodałem następujące adviceWithRouteBuilder

context.getRouteDefinition("external").adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     weaveAddLast().to("mock:result"); 
     weaveByToUri(".*http4://.*") 
      .replace() 
      .to("direct:foo"); 
    } 
}); 

Ten wydaje się działać, ale jeśli mogę zmienić kolejność wypowiedzi weave*, tak jak

public void configure() throws Exception { 
    weaveByToUri(".*http4://.*") 
     .replace() 
     .to("direct:foo"); 
    weaveAddLast().to("mock:result"); 
} 

Daje mi następujący błąd

java.lang.IllegalArgumentException: Nie ma wyjścia, który pasuje : * w trasie: Trasa (zewnętrzna) [[Od [bezpośrednio: zewnętrzna]] -> [potok -> [[To [direct: foo]]]]]

Tak naprawdę oczekiwałbym otrzymania taki sam wynik, niezależnie od zamówienia.

+2

Dla większości zastosowań, które miałem z Camelem, nigdy nie używałem funkcji tkania dla funkcji, którą chciałbyś osiągnąć. Co powiedzie się na użycie 'interceptSendToEndpoint (fromEndpoint) .skipSendToOriginalEndpoint(). To (toEndpoint);'? Ponieważ pakiet testów na wielbłądach faktycznie powoduje więcej bólu niż korzyści, stworzyłem pakiet wsparcia dla testów na wielbłądach, który jest nieco łatwiejszy w użyciu. Sprawdź to, załączone przykłady: https://github.com/gmaslowski/camel-test-support – gmaslowski

Odpowiedz

3

Należy zwrócić uwagę, że wywołania weave* są znane tylko z oryginalnego produktu RouteBuilder. Więc kiedy wykonujesz najpierw wywołanie weaveByUri(), zastępuje on .to("http4://www.third-party.com/foo") z .to("direct:foo"), który przypadkowo jest ostatnim punktem końcowym na trasie. Teraz, gdy wykonujesz wywołanie weaveAddLast(), szuka "http4://www.third-party.com/foo", ale go nie znajduje, ponieważ został zastąpiony przez "direct:foo". Powoduje to zgłoszenie wyjątku.

Tak więc, hipotetycznie, istnieje inny punkt końcowy po punkcie końcowym "http4...", który nie jest już ostatnim punktem końcowym na trasie, a Twój adviceWith() powinien działać. Na przykład, to będzie działać, jeśli oryginalna trasa wyglądała mniej więcej tak:

from("direct://external") 
    .routeId("external") 
    .to("http4://www.third-party.com/foo") 
    .id("ext") 
    .to("direct://bar") 
; 

Należy zauważyć, że myślę, że jest to błąd i że kolejność nie powinno mieć znaczenia.

+0

Doskonała odpowiedź, szkoda, że ​​nie odpowiedziałeś przed przekroczeniem limitu czasu (które dałoby ci 500 punktów SO). – helpermethod

+1

Dzięki Zapisałem bilet, aby sprawdzić, czy możemy to poprawić/naprawić: https://issues.apache.org/jira/browse/CAMEL-10855 –