1. 程式人生 > >apache camel 簡單路由條件篩選

apache camel 簡單路由條件篩選

Camel中支援的路由規則非常豐富,包括:Message Filter、Based Router、Dynamic Router、Splitter、Aggregator、Resequencer等等。在Camel的官方文件中使用了非常形象化的圖形來表示這些路由功能(http://camel.apache.org/enterprise-integration-patterns.html):

 

1、第一個路由選擇器 通過header定義屬性進行判斷

public void configure() throws Exception {

from("timer://user?period=1000").process(new Processor() {

@Override

public void process(Exchange exchange) throws Exception {

Message in = exchange.getIn();

in.setHeader("name","1");

in.setHeader("age","1");

}

}).choice()

.when(new Predicate() {

@Override

public boolean matches(Exchange exchange) {

return exchange.getIn().getHeader("name").equals("1");

}

}).process(new Processor() {

@Override

public void process(Exchange exchange) throws Exception {

System.out.println("name");

}

})

.when(new Predicate() {

@Override

public boolean matches(Exchange exchange) {

return exchange.getIn().getHeader("age").equals("1");

}

}).process(new Processor() {

@Override

public void process(Exchange exchange) throws Exception {

System.out.println("age");

}

})

.otherwise().process(new Processor() {

@Override

public void process(Exchange exchange) throws Exception {

System.out.println("others");

}

}).endChoice();



}

當某一個條件成立後,不進行後續判斷直接結束

2、一些ExpressionClause<ChoiceDefinition> 的方法使用

2.1 exchange

可以將

.when(new Predicate() {

@Override

public boolean matches(Exchange exchange) {

return exchange.getIn().getHeader("age").equals("1");

}

})

改成



.when().exchange(exchange -> exchange.getIn().getHeader("age").equals("1"))

可以實現同樣的效果

 

2.2transfrom 和 setbody

 

.transform().exchange(this::transformTo)

public MessageBean transFormTo(Exchange exchange) {
        MessageBean messageBean = new MessageBean();
        messageBean.setAge(1);
        messageBean.setId(1);
        messageBean.setName("testName");
        return messageBean;


    }

transform() 返回值 ExpressionClause exchange(function) 對exchange資訊進行處理

(也可以將transform 改成 setbody())

將之後 函式的返回值設定為body(可以exchange()或者body( ) 等)

例如:exchange()中的方法(transformTo)的返回值設定為 exchange資訊的請求體中

 

同樣可以

.transform(new Expression() {

@Override

public <T> T evaluate(Exchange exchange, Class<T> type) {

System.out.println(exchange);

return (T)"SS";

}

})

T是object類

evaluate()中的方法的返回值設定為 exchange資訊的請求體中 "SS"

 

2.3body

1、引數 class

.when().body(TestBean.class)

當請求體中物件正確時候進行下一步

2 引數 Function<Object, Object> function 方法返回值 object

when().body(this::transFormTo)

transFormTo 方法傳入的物件為 body值 ,根據返回值

3、引數 BiFunction<Object, Map<String, Object>, Object> 方法返回值 object

when().body((o, stringObjectMap) -> "1".equals(o));

o body的object物件 stringObjectMap Map的 header 物件

4、兩個引數 class ,Function<Object, Object> function

.when().body(MessageBean.class ,messageBean -> messageBean.getAge());

類似2 方法 指定了傳入body引數的型別

5、兩個引數 class ,BiFunction<Object, Map<String, Object>, Object>

.when().body(MessageBean.class ,(messageBean,stringObjectMap) -> messageBean.getAge());

類似3 方法 指定了傳入body引數的型別

 

 

 

3、分析兩種的區別

chioce 返回 ChoiceDefinition 類

呼叫when(processor )返回ChoiceDefinition

呼叫from語句時返回為 RouteDefinition

 

兩個類都繼承 processorDefinition 這個類中定義了大量endPoint的方法(詳情看原始碼

 

而當呼叫when()無參方法時候 返回 ExpressionClause<ChoiceDefinition>

這個類的中文介紹是:

表示DSL中的表示式子句,當表示式完成時,子句將繼續到DSL的另一部分。

也就是說當呼叫when()通過這個類中的方法進行選擇判斷

 

很多方法的返回值都是泛型 T 對上例來說就是 ChoiceDefinition 就可以繼續進行之後判斷操作

具體請看原始碼