apache camel単純ルーティング条件フィルタ

4941 ワード

Camelでサポートされているルーティングルールは、Message Filter、Based Router、Dynamic Router、Splitter、Aggregator、Resequencerなど、非常に豊富です.Camelの公式文書では、これらのルーティング機能を表す非常にイメージ化されたグラフィックが使用されています(http://camel.apache.org/enterprise-integration-patterns.html):
 
1、最初のルーティングセレクタはヘッダ定義属性で判断する
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の方法の使用
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.2 transfromと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()のメソッドの戻り値がexchange情報のリクエストボディに設定されている場合
 
同じように
.transform(new Expression() {

@Override

public  T evaluate(Exchange exchange, Class type) {

System.out.println(exchange);

return (T)"SS";

}

})

Tはobjectクラス
evaluate()のメソッドの戻り値をexchange情報のリクエストボディの「SS」に設定
 
2.3body
1、パラメータclass
.when().body(TestBean.class)

リクエストボディ内のオブジェクトが正しい場合は、次のステップに進みます.
2パラメータFunction functionメソッド戻り値object
when().body(this::transFormTo)

TransFormToメソッドが入力するオブジェクトはbody値であり,戻り値に基づいている.
3、パラメータBiFunction,Object>メソッド戻り値object
when().body((o, stringObjectMap) -> "1".equals(o));

o bodyのobjectオブジェクトstringObjectMapのヘッダオブジェクト
4、二つのパラメータclass,Function function
.when().body(MessageBean.class ,messageBean -> messageBean.getAge());

同様に2つの方法でbodyパラメータを入力するタイプを指定します.
5、2つのパラメータclass,BiFunction,Object>
.when().body(MessageBean.class ,(messageBean,stringObjectMap) -> messageBean.getAge());

同様に3つの方法でbodyパラメータを入力するタイプを指定します.
 
 
 
3、二つの違いを分析する
chioceはChoiceDefinitionクラスを返します
when(processor)を呼び出してChoiceDefinitionに戻る
apache camel 简单路由条件筛选_第1张图片
from文を呼び出すとRouteDefinitionに戻ります
apache camel 简单路由条件筛选_第2张图片
 
両方のクラスはprocessordDefinitionというクラスで大量のendPointを定義する方法を継承しています(詳細はソースコードを参照)
 
一方、when()を呼び出してメソッドがない場合はExpressionClauseに戻ります.
apache camel 简单路由条件筛选_第3张图片
この類の中国語の紹介は:
DSLの式の句を表し、式が完了すると、句はDSLの別の部分に続きます.
すなわちwhen()を呼び出してこのクラスのメソッドで選択判断を行う.
 
多くのメソッドの戻り値は汎用Tである.上の例ではChoiceDefinitionであり,その後の判断操作を継続することができる.
具体的にはソースをご覧ください