2016-08-25 2 views
2

Есть ли конструкция в Apache Camel (в Java DSL), подобная Java-коммутатору?Корпус коммутатора в Apache Camel

Например:

from(incomingRoute) 
    .choice() 
    .when(simple("${body.getType} == '" + TYPE.A.name() + "'")) 
       .to(A_Endpoint) 
    .when(simple("${body.getType} == '" + TYPE.B.name() + "'")) 
       .to(B_Endpoint) 
    .when(simple("${body.getType} == '" + TYPE.C.name() + "'")) 
       .to(C_Endpoint) 
    .otherwise() 
       .to(errorEndpoint); 

Может быть переведен на что-то еще более похож на выключатель? Я имею в виду, что я не хочу использовать простые предикаты, а только значение типа элемента body. Или мой подход совершенно неправильный? (Это может быть разумно)

+1

Вы можете использовать Предикаты, но это не то же самое, как переключатель Java в том смысле, в предположении равенства) тест (. Таким образом, он повторяется по-своему. Тем не менее, вы можете предпочесть его для удобочитаемости в некоторых случаях: http://camel.apache.org/predicate.html –

+0

Я полностью согласен с Дариусом, Camel 'Predicate's, как правило, подходит, на мой взгляд, ваш код гораздо более читаемым. –

ответ

3

Я вообще предпочитаю использовать Java 8 лямбды в этом конкретном случае:

public void configure() throws Exception { 
    from(incomingRoute) 
    .choice() 
    .when(bodyTypeIs(TYPE.A)) 
       .to(A_Endpoint) 
    .when(bodyTypeIs( TYPE.B)) 
       .to(B_Endpoint) 
    .when(bodyTypeIs( TYPE.C)) 
       .to(C_Endpoint) 
    .otherwise() 
       .to(errorEndpoint); 
} 

private Predicate bodyTypeIs(TYPE type) { 
    return e -> e.getIn().getBody(BodyType.class).getType() == type; 
} 

Кроме того, с помощью верблюжьего Predicate с с Java 8 позволяет некоторым удивительным плавное здание API, например, добавление вашего собственного типа функций Predicate:

@FunctionalInterface 
public interface ComposablePredicate extends Predicate, java.util.function.Predicate<Exchange> { 

    @Override 
    default boolean matches(Exchange exchange) { 
    return test(exchange); 
    } 

    @Override 
    default ComposablePredicate and(java.util.function.Predicate<? super Exchange> other) { 
    Objects.requireNonNull(other); 
    return (t) -> test(t) && other.test(t); 
    } 

    @Override 
    default ComposablePredicate negate() { 
    return (t) -> !test(t); 
    } 

    @Override 
    default ComposablePredicate or(java.util.function.Predicate<? super Exchange> other) { 
    Objects.requireNonNull(other); 
    return (t) -> test(t) || other.test(t); 
    } 
} 

Что позволяет писать такие вещи, как:

public void configure() throws Exception { 
    from(incomingRoute) 
    .choice() 
    .when(bodyTypeIs(TYPE.A) .or (bodyTypeIs(TYPE.A1))) 
       .to(A_Endpoint) 
    .when(bodyTypeIs( TYPE.B).negate()) 
       .to(NOT_B_Endpoint) 
    .when(bodyTypeIs( TYPE.C) .and (bodyNameIs("name"))) 
       .to(C_Endpoint) 
    .otherwise() 
       .to(errorEndpoint); 
} 

private ComposablePredicate bodyTypeIs(TYPE type) { 
    return e -> bodyFrom(e).getType() == type; 
} 

private BodyType bodyFrom(Exchange e) { 
    return e.getIn().getBody(BodyType.class); 
} 

private ComposablePredicate bodyNameIs(String name) { 
    return e -> bodyFrom(e).getName().equals(name); 
} 
Смежные вопросы