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 就可以继续进行之后判断操作

具体请看源码

猜你喜欢

转载自blog.csdn.net/asd5629626/article/details/81627700