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 就可以繼續進行之後判斷操作
具體請看原始碼